Skip to content

Commit 5a3f67c

Browse files
committed
BUG: assignment of rows via ix in mixed-dtype DataFrame. close #1432
1 parent 2cee459 commit 5a3f67c

File tree

3 files changed

+35
-26
lines changed

3 files changed

+35
-26
lines changed

RELEASE.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ pandas 0.8.0
177177
- Treat dict return values as Series in GroupBy.apply (#823)
178178
- Respect column selection for DataFrame in in GroupBy.transform (#1365)
179179
- Fix MultiIndex partial indexing bug (#1352)
180+
- Enable assignment of rows in mixed-type DataFrame via .ix (#1432)
180181

181182
pandas 0.7.3
182183
============

pandas/core/indexing.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,15 @@ def _setitem_with_indexer(self, indexer, value):
8888

8989
plane_indexer = indexer[:het_axis] + indexer[het_axis + 1:]
9090
item_labels = self.obj._get_axis(het_axis)
91-
for item in item_labels[het_idx]:
92-
data = self.obj[item]
93-
data.values[plane_indexer] = value
91+
92+
try:
93+
for item in item_labels[het_idx]:
94+
data = self.obj[item]
95+
data.values[plane_indexer] = value
96+
except ValueError:
97+
for item, v in zip(item_labels[het_idx], value):
98+
data = self.obj[item]
99+
data.values[plane_indexer] = v
94100
else:
95101
if isinstance(indexer, tuple):
96102
indexer = _maybe_convert_ix(*indexer)

pandas/tests/test_frame.py

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -640,8 +640,31 @@ def test_setitem_fancy_mixed_2d(self):
640640
self.mixed_frame.ix[5] = np.nan
641641
self.assert_(isnull(self.mixed_frame.ix[5]).all())
642642

643-
self.assertRaises(Exception, self.mixed_frame.ix.__setitem__,
644-
5, self.mixed_frame.ix[6])
643+
self.mixed_frame.ix[5] = self.mixed_frame.ix[6]
644+
assert_series_equal(self.mixed_frame.ix[5], self.mixed_frame.ix[6])
645+
646+
# #1432
647+
df = DataFrame({1: [1., 2., 3.],
648+
2: [3, 4, 5]})
649+
self.assert_(df._is_mixed_type)
650+
651+
df.ix[1] = [5, 10]
652+
653+
expected = DataFrame({1: [1., 5., 3.],
654+
2: [3, 10, 5]})
655+
656+
assert_frame_equal(df, expected)
657+
658+
def test_getitem_setitem_non_ix_labels(self):
659+
df = tm.makeTimeDataFrame()
660+
661+
start, end = df.index[[5, 10]]
662+
663+
result = df.ix[start:end]
664+
result2 = df[start:end]
665+
expected = df[5:11]
666+
assert_frame_equal(result, expected)
667+
assert_frame_equal(result2, expected)
645668

646669
def test_ix_assign_column_mixed(self):
647670
# GH #1142
@@ -906,27 +929,6 @@ def test_setitem_single_column_mixed(self):
906929
expected = [nan, 'qux', nan, 'qux', nan]
907930
assert_almost_equal(df['str'].values, expected)
908931

909-
def test_getitem_setitem_non_ix_labels(self):
910-
df = tm.makeTimeDataFrame()
911-
912-
start, end = df.index[[5, 10]]
913-
914-
result = df.ix[start:end]
915-
result2 = df[start:end]
916-
expected = df[5:11]
917-
assert_frame_equal(result, expected)
918-
assert_frame_equal(result2, expected)
919-
920-
# not implementing this yet
921-
922-
# exp = df.copy()
923-
# exp[5:10] = exp[-5:].values
924-
925-
# # setting
926-
927-
# df[start:end] = df[-5:].values
928-
# assert_frame_equal(df, exp)
929-
930932
def test_setitem_fancy_exceptions(self):
931933
pass
932934

0 commit comments

Comments
 (0)