Skip to content

Commit 8c8d06b

Browse files
committed
ENH: partial multiple setting on first level via .ix on DataFrame, close #409
1 parent d84c6d9 commit 8c8d06b

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

pandas/core/indexing.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,6 @@ def _getitem_axis(self, key, axis=0):
197197

198198
def _getitem_iterable(self, key, axis=0):
199199
labels = self.obj._get_axis(axis)
200-
# axis_name = self.obj._get_axis_name(axis)
201200

202201
def _reindex(keys, level=None):
203202
try:
@@ -305,8 +304,18 @@ def _convert_to_indexer(self, obj, axis=0):
305304
if _is_integer_dtype(objarr) and not is_int_index:
306305
return objarr
307306

308-
indexer = labels.get_indexer(objarr)
309-
mask = indexer == -1
307+
# this is not the most robust, but...
308+
if (isinstance(labels, MultiIndex) and
309+
not isinstance(objarr[0], tuple)):
310+
level = 0
311+
_, indexer = labels.reindex(objarr, level=level)
312+
313+
check = labels.levels[0].get_indexer(objarr)
314+
else:
315+
level = None
316+
indexer = check = labels.get_indexer(objarr)
317+
318+
mask = check == -1
310319
if mask.any():
311320
raise KeyError('%s not in index' % objarr[mask])
312321

pandas/tests/test_multilevel.py

+29
Original file line numberDiff line numberDiff line change
@@ -1233,6 +1233,35 @@ def test_reindex_level_partial_selection(self):
12331233
result = self.frame.T.ix[:, ['foo', 'qux']]
12341234
assert_frame_equal(result, expected.T)
12351235

1236+
def test_setitem_multiple_partial(self):
1237+
expected = self.frame.copy()
1238+
result = self.frame.copy()
1239+
result.ix[['foo', 'bar']] = 0
1240+
expected.ix['foo'] = 0
1241+
expected.ix['bar'] = 0
1242+
assert_frame_equal(result, expected)
1243+
1244+
expected = self.frame.copy()
1245+
result = self.frame.copy()
1246+
result.ix['foo':'bar'] = 0
1247+
expected.ix['foo'] = 0
1248+
expected.ix['bar'] = 0
1249+
assert_frame_equal(result, expected)
1250+
1251+
expected = self.frame['A'].copy()
1252+
result = self.frame['A'].copy()
1253+
result.ix[['foo', 'bar']] = 0
1254+
expected.ix['foo'] = 0
1255+
expected.ix['bar'] = 0
1256+
assert_series_equal(result, expected)
1257+
1258+
expected = self.frame['A'].copy()
1259+
result = self.frame['A'].copy()
1260+
result.ix['foo':'bar'] = 0
1261+
expected.ix['foo'] = 0
1262+
expected.ix['bar'] = 0
1263+
assert_series_equal(result, expected)
1264+
12361265
def test_drop_level(self):
12371266
result = self.frame.drop(['bar', 'qux'], level='first')
12381267
expected = self.frame.ix[[0, 1, 2, 5, 6]]

0 commit comments

Comments
 (0)