Skip to content

Commit 81661af

Browse files
committed
BUG: MultiIndex.__getitem__ failure with NA values causing downstream problems. close #2008
1 parent 0d6fb1b commit 81661af

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

RELEASE.rst

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ pandas 0.9.1
8181
- Better floating point error robustness in some rolling_* functions (#2114)
8282
- Fix ewma NA handling in the middle of Series (#2128)
8383
- Fix numerical precision issues in diff with integer data (#2087)
84+
- Fix bug in MultiIndex.__getitem__ with NA values (#2008)
8485
8586
pandas 0.9.0
8687
============

pandas/core/index.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -1633,8 +1633,14 @@ def __setstate__(self, state):
16331633

16341634
def __getitem__(self, key):
16351635
if np.isscalar(key):
1636-
return tuple(lev[lab[key]]
1637-
for lev, lab in zip(self.levels, self.labels))
1636+
retval = []
1637+
for lev, lab in zip(self.levels, self.labels):
1638+
if lab[key] == -1:
1639+
retval.append(np.nan)
1640+
else:
1641+
retval.append(lev[lab[key]])
1642+
1643+
return tuple(retval)
16381644
else:
16391645
if com._is_bool_indexer(key):
16401646
key = np.asarray(key)

pandas/tests/test_multilevel.py

+16
Original file line numberDiff line numberDiff line change
@@ -1562,6 +1562,22 @@ def test_xs_mixed_no_copy(self):
15621562

15631563
self.assertRaises(Exception, data.xs, 2, level=1, copy=False)
15641564

1565+
def test_multiindex_na_repr(self):
1566+
# only an issue with long columns
1567+
1568+
from numpy import nan
1569+
df3 = DataFrame({
1570+
'A' * 30: {('A', 'A0006000', 'nuit'): 'A0006000'},
1571+
'B' * 30: {('A', 'A0006000', 'nuit'): nan},
1572+
'C' * 30: {('A', 'A0006000', 'nuit'): nan},
1573+
'D' * 30: {('A', 'A0006000', 'nuit'): nan},
1574+
'E' * 30: {('A', 'A0006000', 'nuit'): 'A'},
1575+
'F' * 30: {('A', 'A0006000', 'nuit'): nan},
1576+
})
1577+
1578+
idf = df3.set_index(['A' * 30, 'C' * 30])
1579+
repr(idf)
1580+
15651581
if __name__ == '__main__':
15661582

15671583
# unittest.main()

pandas/tests/test_panel.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1081,7 +1081,7 @@ def test_shift(self):
10811081
# negative numbers, #2164
10821082
result = self.panel.shift(-1)
10831083
expected = Panel(dict((i, f.shift(-1)[:-1])
1084-
for i, f in self.panel.iteritems()))
1084+
for i, f in self.panel.iterkv()))
10851085
assert_panel_equal(result, expected)
10861086

10871087
def test_multiindex_get(self):
@@ -1175,7 +1175,7 @@ def test_to_excel(self):
11751175
path = '__tmp__.' + ext
11761176
self.panel.to_excel(path)
11771177
reader = ExcelFile(path)
1178-
for item, df in self.panel.iteritems():
1178+
for item, df in self.panel.iterkv():
11791179
recdf = reader.parse(str(item),index_col=0)
11801180
assert_frame_equal(df, recdf)
11811181
os.remove(path)

0 commit comments

Comments
 (0)