Skip to content

Commit bc4fb0d

Browse files
committed
ENH: groupby level name instead of number, GH #223
1 parent 52723fa commit bc4fb0d

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

pandas/core/groupby.py

+4
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,10 @@ def __init__(self, index, grouper=None, name=None, level=None):
503503
self.index = index
504504

505505
if level is not None:
506+
if not isinstance(level, int):
507+
assert(level in index.names)
508+
level = index.names.index(level)
509+
506510
inds = index.labels[level]
507511
labels = index.levels[level].take(inds)
508512

pandas/tests/test_groupby.py

+15-6
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ def setUp(self):
5656
index = MultiIndex(levels=[['foo', 'bar', 'baz', 'qux'],
5757
['one', 'two', 'three']],
5858
labels=[[0, 0, 0, 1, 1, 2, 2, 3, 3, 3],
59-
[0, 1, 2, 0, 1, 1, 2, 0, 1, 2]])
59+
[0, 1, 2, 0, 1, 1, 2, 0, 1, 2]],
60+
names=['first', 'second'])
6061
self.mframe = DataFrame(np.random.randn(10, 3), index=index,
6162
columns=['A', 'B', 'C'])
6263

@@ -655,7 +656,7 @@ def _testit(op):
655656

656657
def test_grouping_attrs(self):
657658
deleveled = self.mframe.delevel()
658-
grouped = deleveled.groupby(['level_0', 'level_1'])
659+
grouped = deleveled.groupby(['first', 'second'])
659660

660661
for i, ping in enumerate(grouped.groupings):
661662
the_counts = self.mframe.groupby(level=i).count()['A']
@@ -668,12 +669,20 @@ def test_groupby_level(self):
668669
result0 = frame.groupby(level=0).sum()
669670
result1 = frame.groupby(level=1).sum()
670671

671-
expected0 = frame.groupby(deleveled['level_0']).sum()
672-
expected1 = frame.groupby(deleveled['level_1']).sum()
672+
expected0 = frame.groupby(deleveled['first']).sum()
673+
expected1 = frame.groupby(deleveled['second']).sum()
673674

674675
assert_frame_equal(result0, expected0)
675676
assert_frame_equal(result1, expected1)
676677

678+
# groupby level name
679+
result0 = frame.groupby(level='first').sum()
680+
result1 = frame.groupby(level='second').sum()
681+
assert_frame_equal(result0, expected0)
682+
assert_frame_equal(result1, expected1)
683+
684+
# axis=1
685+
677686
result0 = frame.T.groupby(level=0, axis=1).sum()
678687
result1 = frame.T.groupby(level=1, axis=1).sum()
679688
assert_frame_equal(result0, expected0.T)
@@ -693,8 +702,8 @@ def test_groupby_level_mapper(self):
693702
result0 = frame.groupby(mapper0, level=0).sum()
694703
result1 = frame.groupby(mapper1, level=1).sum()
695704

696-
mapped_level0 = np.array([mapper0.get(x) for x in deleveled['level_0']])
697-
mapped_level1 = np.array([mapper1.get(x) for x in deleveled['level_1']])
705+
mapped_level0 = np.array([mapper0.get(x) for x in deleveled['first']])
706+
mapped_level1 = np.array([mapper1.get(x) for x in deleveled['second']])
698707
expected0 = frame.groupby(mapped_level0).sum()
699708
expected1 = frame.groupby(mapped_level1).sum()
700709

0 commit comments

Comments
 (0)