Skip to content

Commit b3a6107

Browse files
committed
ENH: handle dict return values and vbench, close #823
1 parent 40972df commit b3a6107

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

pandas/core/groupby.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1213,7 +1213,11 @@ def _get_index():
12131213
index = Index(keys, name=self.grouper.names[0])
12141214
return index
12151215

1216-
if isinstance(values[0], Series):
1216+
if isinstance(values[0], dict):
1217+
# # GH #823
1218+
return DataFrame(values, index=keys).stack()
1219+
1220+
if isinstance(values[0], (Series, dict)):
12171221
return self._concat_objects(keys, values,
12181222
not_indexed_same=not_indexed_same)
12191223
elif isinstance(values[0], DataFrame):

pandas/tests/test_groupby.py

+13
Original file line numberDiff line numberDiff line change
@@ -1701,6 +1701,19 @@ def test_multifunc_sum_bug(self):
17011701
result = grouped.agg({'fl':'sum',2:'size'})
17021702
self.assert_(result['fl'].dtype == np.float64)
17031703

1704+
def test_handle_dict_return_value(self):
1705+
def f(group):
1706+
return {'min': group.min(), 'max': group.max()}
1707+
1708+
def g(group):
1709+
return Series({'min': group.min(), 'max': group.max()})
1710+
1711+
result = self.df.groupby('A')['C'].apply(f)
1712+
expected = self.df.groupby('A')['C'].apply(g)
1713+
1714+
self.assert_(isinstance(result, Series))
1715+
assert_series_equal(result, expected)
1716+
17041717
def _check_groupby(df, result, keys, field, f=lambda x: x.sum()):
17051718
tups = map(tuple, df[keys].values)
17061719
tups = com._asarray_tuplesafe(tups)

vb_suite/groupby.py

+11
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,14 @@ def f():
144144
groupby_pivot_table = Benchmark(stmt, setup, start_date=datetime(2011, 12, 15))
145145

146146

147+
#----------------------------------------------------------------------
148+
# dict return values
149+
150+
setup = common_setup + """
151+
labels = np.arange(1000).repeat(10)
152+
data = Series(randn(len(labels)))
153+
f = lambda x: {'first': x.values[0], 'last': x.values[-1]}
154+
"""
155+
156+
groupby_apply_dict_return = Benchmark('data.groupby(labels).apply(f)',
157+
setup, start_date=datetime(2011, 12, 15))

0 commit comments

Comments
 (0)