Skip to content

Commit b7c3d2c

Browse files
committed
BUG: don't lose names in MultiIndex.droplevel, fix #394
1 parent 3eca074 commit b7c3d2c

File tree

4 files changed

+38
-4
lines changed

4 files changed

+38
-4
lines changed

RELEASE.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ pandas 0.5.1
135135
- Handle min_periods=0 case in moving window functions (GH #365)
136136
- Fixed corner cases in DataFrame.apply/pivot with empty DataFrame (GH #378)
137137
- Fixed repr exception when Series name is a tuple
138-
- Always return DateRange from asfreq (GH #390)
139-
-
138+
- Always return DateRange from `asfreq` (GH #390)
139+
- Pass level names to `swaplavel` (GH #379)
140140

141141
Thanks
142142
------

pandas/core/index.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ def dtype(self):
7373
def nlevels(self):
7474
return 1
7575

76+
@property
77+
def names(self):
78+
# for compat with multindex code
79+
return [self.name]
80+
7681
@property
7782
def _constructor(self):
7883
return Index
@@ -864,6 +869,9 @@ class MultiIndex(Index):
864869
labels : list or tuple of arrays
865870
Integers for each level designating which label at each location
866871
"""
872+
# shadow property
873+
names = None
874+
867875
def __new__(cls, levels=None, labels=None, sortorder=None, names=None):
868876
assert(len(levels) == len(labels))
869877
if len(levels) == 0:
@@ -1178,11 +1186,16 @@ def droplevel(self, level=0):
11781186
new_levels.pop(level)
11791187
new_labels = list(self.labels)
11801188
new_labels.pop(level)
1189+
new_names = list(self.names)
1190+
new_names.pop(level)
11811191

11821192
if len(new_levels) == 1:
1183-
return new_levels[0].take(new_labels[0])
1193+
result = new_levels[0].take(new_labels[0])
1194+
result.name = new_names[0]
1195+
return result
11841196
else:
1185-
return MultiIndex(levels=new_levels, labels=new_labels)
1197+
return MultiIndex(levels=new_levels, labels=new_labels,
1198+
names=new_names)
11861199

11871200
def swaplevel(self, i, j):
11881201
"""

pandas/tests/test_index.py

+10
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,16 @@ def test_droplevel_with_names(self):
10741074
dropped = index.droplevel(0)
10751075
self.assertEqual(dropped.name, 'second')
10761076

1077+
index = MultiIndex(levels=[Index(range(4)),
1078+
Index(range(4)),
1079+
Index(range(4))],
1080+
labels=[np.array([0, 0, 1, 2, 2, 2, 3, 3]),
1081+
np.array([0, 1, 0, 0, 0, 1, 0, 1]),
1082+
np.array([1, 0, 1, 1, 0, 0, 1, 0])],
1083+
names=['one', 'two', 'three'])
1084+
dropped = index.droplevel(0)
1085+
self.assertEqual(dropped.names, ['two', 'three'])
1086+
10771087
def test_insert(self):
10781088
# key contained in all levels
10791089
new_index = self.index.insert(0, ('bar', 'two'))

pandas/tests/test_multilevel.py

+11
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,17 @@ def test_multilevel_consolidate(self):
652652
df['Totals', ''] = df.sum(1)
653653
df = df.consolidate()
654654

655+
def test_ix_preserve_names(self):
656+
result = self.ymd.ix[2000]
657+
result2 = self.ymd['A'].ix[2000]
658+
self.assertEquals(result.index.names, self.ymd.index.names[1:])
659+
self.assertEquals(result2.index.names, self.ymd.index.names[1:])
660+
661+
result = self.ymd.ix[2000, 2]
662+
result2 = self.ymd['A'].ix[2000, 2]
663+
self.assertEquals(result.index.name, self.ymd.index.names[2])
664+
self.assertEquals(result2.index.name, self.ymd.index.names[2])
665+
655666
if __name__ == '__main__':
656667

657668
# unittest.main()

0 commit comments

Comments
 (0)