Skip to content

Commit a150d29

Browse files
committed
BUG: closes #691, assignment with ix and mixed dtypes
1 parent 8f32f1c commit a150d29

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

Diff for: pandas/core/frame.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1276,7 +1276,7 @@ def iget_value(self, i, j):
12761276
col = self.columns[j]
12771277
return self.get_value(row, col)
12781278

1279-
def __getitem__(self, key):
1279+
def __getitem__(self, key, copy=True):
12801280
# slice rows
12811281
if isinstance(key, slice):
12821282
new_data = self._data.get_slice(key, axis=1)
@@ -1289,13 +1289,13 @@ def __getitem__(self, key):
12891289
# also raises Exception if object array with NA values
12901290
if com._is_bool_indexer(key):
12911291
key = np.asarray(key, dtype=bool)
1292-
return self._getitem_array(key)
1292+
return self._getitem_array(key, copy=copy)
12931293
elif isinstance(self.columns, MultiIndex):
12941294
return self._getitem_multilevel(key)
12951295
else:
12961296
return self._get_item_cache(key)
12971297

1298-
def _getitem_array(self, key):
1298+
def _getitem_array(self, key, copy=True):
12991299
if key.dtype == np.bool_:
13001300
if len(key) != len(self.index):
13011301
raise ValueError('Item wrong length %d instead of %d!' %
@@ -1308,7 +1308,7 @@ def _getitem_array(self, key):
13081308
mask = indexer == -1
13091309
if mask.any():
13101310
raise KeyError("No column(s) named: %s" % str(key[mask]))
1311-
result = self.reindex(columns=key)
1311+
result = self.reindex(columns=key, copy=copy)
13121312
if result.columns.name is None:
13131313
result.columns.name = self.columns.name
13141314
return result

Diff for: pandas/core/indexing.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def _convert_tuple(self, key):
6666
for i, k in enumerate(key):
6767
idx = self._convert_to_indexer(k, axis=i)
6868
keyidx.append(idx)
69-
return _maybe_convert_ix(*keyidx)
69+
return tuple(keyidx)
7070

7171
def _setitem_with_indexer(self, indexer, value):
7272
# also has the side effect of consolidating in-place
@@ -90,7 +90,9 @@ def _setitem_with_indexer(self, indexer, value):
9090
data = self.obj[item]
9191
data.values[plane_indexer] = value
9292
else:
93-
self.obj.values[indexer] = value
93+
if isinstance(indexer, tuple):
94+
indexer = _maybe_convert_ix(*indexer)
95+
self.obj.values[indexer] = value
9496

9597
def _getitem_tuple(self, tup):
9698
try:

Diff for: pandas/tests/test_frame.py

+13
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,19 @@ def test_setitem_corner(self):
295295
dm['coercable'] = ['1', '2', '3']
296296
self.assertEqual(dm['coercable'].dtype, np.object_)
297297

298+
def test_setitem_corner2(self):
299+
data = {"title" : ['foobar','bar','foobar'] + ['foobar'] * 17 ,
300+
"cruft" : np.random.random(20)}
301+
302+
df = DataFrame(data)
303+
ix = df[df['title'] == 'bar'].index
304+
305+
df.ix[ix, ['title']] = 'foobar'
306+
df.ix[ix, ['cruft']] = 0
307+
308+
assert( df.ix[1, 'title'] == 'foobar' )
309+
assert( df.ix[1, 'cruft'] == 0 )
310+
298311
def test_setitem_ambig(self):
299312
# difficulties with mixed-type data
300313
from decimal import Decimal

0 commit comments

Comments
 (0)