In both the bellow cases:
import pandas
d = {\'col1\': 2, \'col2\': 2.5}
df = pandas.DataFrame(data=d, index=[0])
print(df[\'col2\'])
print(df.col2)
The "dot notation", i.e. df.col2
is the attribute access that's exposed as a convenience.
You may access an index on a Series, column on a DataFrame, and an item on a Panel directly as an attribute:
df['col2']
does the same: it returns a pd.Series
of the column.
A few caveats about attribute access:
df.new_col = x
won't work, worse: it will silently actually create a new attribute rather than a column - think monkey-patching here)