Skip to content

Commit 6418067

Browse files
committed
BUG: pass index name in GroupBy.apply, GH #416
1 parent 0505033 commit 6418067

File tree

3 files changed

+26
-7
lines changed

3 files changed

+26
-7
lines changed

RELEASE.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ pandas 0.6.0
7676
- MaskedArray can be passed to DataFrame constructor and masked values will be
7777
converted to NaN (PR #396)
7878
- Add `DataFrame.boxplot` function (GH #368, others)
79+
- Can pass extra args, kwds to DataFrame.apply (GH #376)
7980
8081
**Improvements to existing features**
8182

pandas/core/groupby.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -756,12 +756,18 @@ def _wrap_applied_output(self, keys, values, not_indexed_same=False):
756756

757757
key_names = [ping.name for ping in self.groupings]
758758

759+
def _get_index():
760+
if len(self.groupings) > 1:
761+
index = MultiIndex.from_tuples(keys, names=key_names)
762+
else:
763+
index = Index(keys, name=key_names[0])
764+
return index
765+
759766
if isinstance(values[0], Series):
760767
if not_indexed_same:
761768
data_dict = dict(zip(keys, values))
762769
result = DataFrame(data_dict).T
763-
if len(self.groupings) > 1:
764-
result.index = MultiIndex.from_tuples(keys, names=key_names)
770+
result.index = _get_index()
765771
return result
766772
else:
767773
cat_values = np.concatenate([x.values for x in values])
@@ -774,11 +780,7 @@ def _wrap_applied_output(self, keys, values, not_indexed_same=False):
774780
return self._wrap_frames(keys, values,
775781
not_indexed_same=not_indexed_same)
776782
else:
777-
if len(self.groupings) > 1:
778-
index = MultiIndex.from_tuples(keys, names=key_names)
779-
return Series(values, index)
780-
else:
781-
return Series(values, keys)
783+
return Series(values, index=_get_index())
782784

783785
def _aggregate_multiple_funcs(self, arg):
784786
if not isinstance(arg, dict):
@@ -1071,6 +1073,8 @@ def _wrap_applied_output(self, keys, values, not_indexed_same=False):
10711073
else:
10721074
if len(self.groupings) > 1:
10731075
keys = MultiIndex.from_tuples(keys, names=key_names)
1076+
else:
1077+
keys = Index(keys, name=key_names[0])
10741078

10751079
if isinstance(values[0], np.ndarray):
10761080
if self.axis == 0:

pandas/tests/test_groupby.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,9 @@ def test_groupby_level(self):
732732
expected0 = frame.groupby(deleveled['first']).sum()
733733
expected1 = frame.groupby(deleveled['second']).sum()
734734

735+
self.assert_(result0.index.name == 'first')
736+
self.assert_(result1.index.name == 'second')
737+
735738
assert_frame_equal(result0, expected0)
736739
assert_frame_equal(result1, expected1)
737740
self.assertEquals(result0.index.name, frame.index.names[0])
@@ -753,6 +756,17 @@ def test_groupby_level(self):
753756
# raise exception for non-MultiIndex
754757
self.assertRaises(ValueError, self.df.groupby, level=0)
755758

759+
def test_groupby_level_apply(self):
760+
frame = self.mframe
761+
762+
result = frame.groupby(level=0).count()
763+
self.assert_(result.index.name == 'first')
764+
result = frame.groupby(level=1).count()
765+
self.assert_(result.index.name == 'second')
766+
767+
result = frame['A'].groupby(level=0).count()
768+
self.assert_(result.index.name == 'first')
769+
756770
def test_groupby_level_mapper(self):
757771
frame = self.mframe
758772
deleveled = frame.delevel()

0 commit comments

Comments
 (0)