Skip to content

Commit 7e4b086

Browse files
committed
ENH: can set existing columns via attributes as convenience, close #883
1 parent 387ec4d commit 7e4b086

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

pandas/core/frame.py

+17
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,23 @@ def __getattr__(self, name):
14791479
raise AttributeError("'%s' object has no attribute '%s'" %
14801480
(type(self).__name__, name))
14811481

1482+
def __setattr__(self, name, value):
1483+
"""After regular attribute access, try looking up the name of a column.
1484+
This allows simpler access to columns for interactive use."""
1485+
if name == '_data':
1486+
super(DataFrame, self).__setattr__(name, value)
1487+
else:
1488+
try:
1489+
existing = getattr(self, name)
1490+
if isinstance(existing, Index):
1491+
super(DataFrame, self).__setattr__(name, value)
1492+
elif name in self.columns:
1493+
self[name] = value
1494+
else:
1495+
object.__setattr__(self, name, value)
1496+
except (AttributeError, TypeError):
1497+
object.__setattr__(self, name, value)
1498+
14821499
def __setitem__(self, key, value):
14831500
# support boolean setting with DataFrame input, e.g.
14841501
# df[df > df2] = 0

pandas/tests/test_frame.py

+6
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@ def test_getattr(self):
149149
self.assertRaises(AttributeError, getattr, self.frame,
150150
'NONEXISTENT_NAME')
151151

152+
def test_setattr_column(self):
153+
df = DataFrame({'foobar' : 1}, index=range(10))
154+
155+
df.foobar = 5
156+
self.assert_((df.foobar == 5).all())
157+
152158
def test_setitem(self):
153159
# not sure what else to do here
154160
series = self.frame['A'][::2]

0 commit comments

Comments
 (0)