Skip to content

Commit 53ae1d5

Browse files
committed
BUG: fix MultiIndex indexing issues in #1537, python 2.5 api fix
1 parent 0a96304 commit 53ae1d5

File tree

4 files changed

+29
-14
lines changed

4 files changed

+29
-14
lines changed

pandas/core/indexing.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,10 @@ def _convert_to_indexer(self, obj, axis=0):
361361
objarr = _check_bool_indexer(labels, obj)
362362
return objarr
363363
else:
364-
objarr = _asarray_tuplesafe(obj)
364+
if isinstance(obj, Index):
365+
objarr = obj.values
366+
else:
367+
objarr = _asarray_tuplesafe(obj)
365368

366369
# If have integer labels, defer to label-based indexing
367370
if _is_integer_dtype(objarr) and not is_int_index:

pandas/core/series.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,10 @@ def _get_with(self, key):
477477
if not isinstance(key, (list, np.ndarray)): # pragma: no cover
478478
key = list(key)
479479

480-
key_type = lib.infer_dtype(key)
480+
if isinstance(key, Index):
481+
key_type = lib.infer_dtype(key.values)
482+
else:
483+
key_type = lib.infer_dtype(key)
481484

482485
if key_type == 'integer':
483486
if self.index.inferred_type == 'integer':
@@ -564,7 +567,10 @@ def _set_with(self, key, value):
564567
if not isinstance(key, (list, np.ndarray)):
565568
key = list(key)
566569

567-
key_type = lib.infer_dtype(key)
570+
if isinstance(key, Index):
571+
key_type = lib.infer_dtype(key.values)
572+
else:
573+
key_type = lib.infer_dtype(key)
568574

569575
if key_type == 'integer':
570576
if self.index.inferred_type == 'integer':
@@ -577,7 +583,10 @@ def _set_with(self, key, value):
577583
self._set_labels(key, value)
578584

579585
def _set_labels(self, key, value):
580-
key = _asarray_tuplesafe(key)
586+
if isinstance(key, Index):
587+
key = key.values
588+
else:
589+
key = _asarray_tuplesafe(key)
581590
indexer = self.index.get_indexer(key)
582591
mask = indexer == -1
583592
if mask.any():

pandas/io/parsers.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,9 +1150,9 @@ def __init__(self, path_or_buf):
11501150
raise ImportError(_openpyxl_msg)
11511151
else:
11521152
import tempfile
1153-
fd = tempfile.NamedTemporaryFile(delete=False)
1153+
fd = tempfile.NamedTemporaryFile()
11541154
fd.write(path_or_buf.read())
1155-
fd.close()
1155+
fd.seek(0)
11561156

11571157
try:
11581158
import xlrd
@@ -1162,14 +1162,7 @@ def __init__(self, path_or_buf):
11621162
from openpyxl.reader.excel import load_workbook
11631163
self.book = load_workbook(fd.name, use_iterators=True)
11641164

1165-
self.tmpfile = fd.name
1166-
1167-
def __name__(self):
1168-
if self.tmpfile:
1169-
try:
1170-
os.remove(self.tmpfile)
1171-
except Exception:
1172-
pass
1165+
self.tmpfile = fd
11731166

11741167
def __repr__(self):
11751168
return object.__repr__(self)

pandas/tests/test_multilevel.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,6 +1394,16 @@ def test_join_segfault(self):
13941394
for how in ['left', 'right', 'outer']:
13951395
df1.join(df2, how=how)
13961396

1397+
def test_set_column_scalar_with_ix(self):
1398+
subset = self.frame.index[[1, 4, 5]]
1399+
1400+
self.frame.ix[subset] = 99
1401+
self.assert_((self.frame.ix[subset].values == 99).all())
1402+
1403+
col = self.frame['B']
1404+
col[subset] = 97
1405+
self.assert_((self.frame.ix[subset, 'B'] == 97).all())
1406+
13971407
if __name__ == '__main__':
13981408

13991409
# unittest.main()

0 commit comments

Comments
 (0)