diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 6338492558254..e5a7ee65e5d0e 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -860,6 +860,14 @@ def _getitem_single(self, key): res = Series(values, index=self.index, name=key) self._series_cache[key] = res return res + + def __getattr__(self, name): + """After regular attribute access, try looking up the name of a column. + This allows simpler access to columns for interactive use.""" + if name in self.columns: + return self[name] + raise AttributeError("'%s' object has no attribute '%s'" % \ + (type(self).__name__, name)) def __setitem__(self, key, value): # support boolean setting with DataFrame input, e.g. diff --git a/pandas/tests/test_frame.py b/pandas/tests/test_frame.py index 06795d5cafd04..559349c6e31f0 100644 --- a/pandas/tests/test_frame.py +++ b/pandas/tests/test_frame.py @@ -67,6 +67,10 @@ def test_getitem_boolean(self): subframe_obj = self.tsframe[indexer_obj] assert_frame_equal(subframe_obj, subframe) + + def test_getattr(self): + tm.assert_series_equal(self.frame.A, self.frame['A']) + self.assertRaises(AttributeError, getattr, self.frame, 'NONEXISTENT_NAME') def test_setitem(self): # not sure what else to do here