Skip to content

Commit 47abe8c

Browse files
author
Chang She
committed
ENH: Panel.transpose #695
1 parent 976cab5 commit 47abe8c

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

pandas/core/panel.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,23 @@ def swapaxes(self, axis1='major', axis2='minor'):
934934

935935
return self._constructor(new_values, *new_axes)
936936

937+
def transpose(self, items='items', major='major', minor='minor'):
938+
"""
939+
Permute the dimensions of the Panel
940+
941+
Returns
942+
-------
943+
y : Panel (new object)
944+
"""
945+
i, j, k = [self._get_axis_number(x) for x in [items, major, minor]]
946+
947+
if i == j or i == k or j == k:
948+
raise ValueError('Must specify 3 unique axes')
949+
950+
new_axes = [self._get_axis(x) for x in [i, j, k]]
951+
new_values = self.values.transpose((i, j, k)).copy()
952+
return self._constructor(new_values, *new_axes)
953+
937954
def to_frame(self, filter_observations=True):
938955
"""
939956
Transform wide format into long (stacked) format as DataFrame

pandas/tests/test_panel.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,39 @@ def test_swapaxes(self):
895895
# this should also work
896896
self.assertRaises(Exception, self.panel.swapaxes, 'items', 'items')
897897

898+
def test_transpose(self):
899+
result = self.panel.transpose('minor', 'major', 'items')
900+
expected = self.panel.swapaxes('items', 'minor')
901+
assert_panel_equal(result, expected)
902+
903+
result = self.panel.transpose(2, 1, 0)
904+
assert_panel_equal(result, expected)
905+
906+
result = self.panel.transpose('minor', 'items', 'major')
907+
expected = self.panel.swapaxes('items', 'minor')
908+
expected = expected.swapaxes('major', 'minor')
909+
assert_panel_equal(result, expected)
910+
911+
result = self.panel.transpose(2, 0, 1)
912+
assert_panel_equal(result, expected)
913+
914+
def test_transpose_sparse(self):
915+
spanel = self.panel.to_sparse()
916+
result = spanel.transpose('minor', 'major', 'items')
917+
expected = spanel.swapaxes('items', 'minor')
918+
assert_panel_equal(result, expected)
919+
920+
result = spanel.transpose(2, 1, 0)
921+
assert_panel_equal(result, expected)
922+
923+
result = spanel.transpose('minor', 'items', 'major')
924+
expected = spanel.swapaxes('items', 'minor')
925+
expected = expected.swapaxes('major', 'minor')
926+
assert_panel_equal(result, expected)
927+
928+
result = spanel.transpose(2, 0, 1)
929+
assert_panel_equal(result, expected)
930+
898931
def test_to_frame(self):
899932
# filtered
900933
filtered = self.panel.to_frame()

0 commit comments

Comments
 (0)