Skip to content

Commit 5f42b95

Browse files
committed
ENH: enable pivot_table with more complex aggregation function and hack multiple level column unstacking into existing hierarchical columns. close #2643
1 parent 0771865 commit 5f42b95

File tree

4 files changed

+33
-2
lines changed

4 files changed

+33
-2
lines changed

pandas/core/index.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,22 @@ def set_value(self, arr, key, value):
753753
"""
754754
self._engine.set_value(arr, key, value)
755755

756+
def get_level_values(self, level):
757+
"""
758+
Return vector of label values for requested level, equal to the length
759+
of the index
760+
761+
Parameters
762+
----------
763+
level : int
764+
765+
Returns
766+
-------
767+
values : ndarray
768+
"""
769+
num = self._get_level_number(level)
770+
return self
771+
756772
def get_indexer(self, target, method=None, limit=None):
757773
"""
758774
Compute indexer and mask for new index given the current index. The

pandas/core/reshape.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,10 @@ def _unstack_multiple(data, clocs):
244244
new_labels = recons_labels
245245
else:
246246
if isinstance(data.columns, MultiIndex):
247-
raise NotImplementedError('Unstacking multiple levels with '
248-
'hierarchical columns not yet supported')
247+
result = data
248+
for val in clocs:
249+
result = result.unstack(val)
250+
return result
249251

250252
dummy = DataFrame(data.values, index=dummy_index,
251253
columns=data.columns)

pandas/tests/test_index.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,11 @@ def test_boolean_cmp(self):
515515
self.assert_(res.dtype == 'bool')
516516
self.assert_(not isinstance(res, Index))
517517

518+
def test_get_level_values(self):
519+
result = self.strIndex.get_level_values(0)
520+
self.assert_(result.equals(self.strIndex))
521+
522+
518523
class TestInt64Index(unittest.TestCase):
519524
_multiprocess_can_split_ = True
520525
def setUp(self):

pandas/tools/tests/test_pivot.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,14 @@ def test_pivot_columns_lexsorted(self):
221221

222222
self.assert_(pivoted.columns.is_monotonic)
223223

224+
def test_pivot_complex_aggfunc(self):
225+
f = {'D': ['std'], 'E': ['sum']}
226+
expected = self.data.groupby(['A', 'B']).agg(f).unstack('B')
227+
result = self.data.pivot_table(rows='A', cols='B', aggfunc=f)
228+
229+
tm.assert_frame_equal(result, expected)
230+
231+
224232
class TestCrosstab(unittest.TestCase):
225233

226234
def setUp(self):

0 commit comments

Comments
 (0)