Skip to content

Commit 8ebeb7a

Browse files
committed
ENH: can set multiple columns at once on DataFrame in __setitem__, per #342
1 parent 5d4bf8f commit 8ebeb7a

File tree

2 files changed

+32
-14
lines changed

2 files changed

+32
-14
lines changed

pandas/core/frame.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,6 +1111,8 @@ def __setitem__(self, key, value):
11111111
'DataFrame objects')
11121112

11131113
self._boolean_set(key, value)
1114+
elif isinstance(key, (np.ndarray, list)):
1115+
return self._set_item_multiple(key, value)
11141116
else:
11151117
# set column
11161118
self._set_item(key, value)
@@ -1129,6 +1131,28 @@ def _boolean_set(self, key, value):
11291131
else:
11301132
self.values[mask] = value
11311133

1134+
def _set_item_multiple(self, keys, value):
1135+
if isinstance(value, DataFrame):
1136+
assert(len(value.columns) == len(keys))
1137+
for k1, k2 in zip(keys, value.columns):
1138+
self[k1] = value[k2]
1139+
else:
1140+
self.ix[:, keys] = value
1141+
1142+
def _set_item(self, key, value):
1143+
"""
1144+
Add series to DataFrame in specified column.
1145+
1146+
If series is a numpy-array (not a Series/TimeSeries), it must be the
1147+
same length as the DataFrame's index or an error will be thrown.
1148+
1149+
Series/TimeSeries will be conformed to the DataFrame's index to
1150+
ensure homogeneity.
1151+
"""
1152+
value = self._sanitize_column(value)
1153+
value = np.atleast_2d(value)
1154+
NDFrame._set_item(self, key, value)
1155+
11321156
def insert(self, loc, column, value):
11331157
"""
11341158
Insert column into DataFrame at specified location. Raises Exception if
@@ -1145,20 +1169,6 @@ def insert(self, loc, column, value):
11451169
value = np.atleast_2d(value)
11461170
self._data.insert(loc, column, value)
11471171

1148-
def _set_item(self, key, value):
1149-
"""
1150-
Add series to DataFrame in specified column.
1151-
1152-
If series is a numpy-array (not a Series/TimeSeries), it must be the
1153-
same length as the DataFrame's index or an error will be thrown.
1154-
1155-
Series/TimeSeries will be conformed to the DataFrame's index to
1156-
ensure homogeneity.
1157-
"""
1158-
value = self._sanitize_column(value)
1159-
value = np.atleast_2d(value)
1160-
NDFrame._set_item(self, key, value)
1161-
11621172
def _sanitize_column(self, value):
11631173
# Need to make sure new columns (which go into the BlockManager as new
11641174
# blocks) are always copied

pandas/tests/test_frame.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ def test_getitem_list(self):
7070
self.assertRaises(Exception, self.frame.__getitem__,
7171
Index(['B', 'A', 'foo']))
7272

73+
def test_setitem_list(self):
74+
self.frame['E'] = 'foo'
75+
data = self.frame[['A', 'B']]
76+
self.frame[['B', 'A']] = data
77+
78+
assert_series_equal(self.frame['B'], data['A'])
79+
assert_series_equal(self.frame['A'], data['B'])
80+
7381
def test_getitem_boolean(self):
7482
# boolean indexing
7583
d = self.tsframe.index[10]

0 commit comments

Comments
 (0)