Skip to content

Commit 2d28acb

Browse files
committed
Merge pull request #3558 from cpcloud/panel-transpose-args-fix-3556
fix panel tranpose arguments api bug
2 parents 2f250dd + df79d05 commit 2d28acb

File tree

3 files changed

+51
-6
lines changed

3 files changed

+51
-6
lines changed

RELEASE.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ pandas 0.11.1
102102
e.g. add datetimes, multiple timedelta x datetime
103103
- Fix ``.diff`` on datelike and timedelta operations (GH3100_)
104104
- ``combine_first`` not returning the same dtype in cases where it can (GH3552_)
105+
- Fixed bug with ``Panel.transpose`` argument aliases (GH3556_)
105106

106107
.. _GH3164: https://github.com/pydata/pandas/issues/3164
107108
.. _GH2786: https://github.com/pydata/pandas/issues/2786
@@ -140,6 +141,7 @@ pandas 0.11.1
140141
.. _GH3552: https://github.com/pydata/pandas/issues/3552
141142
.. _GH3562: https://github.com/pydata/pandas/issues/3562
142143
.. _GH3493: https://github.com/pydata/pandas/issues/3493
144+
.. _GH3556: https://github.com/pydata/pandas/issues/3556
143145

144146

145147
pandas 0.11.0

pandas/core/panel.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,16 +1166,35 @@ def transpose(self, *args, **kwargs):
11661166
-------
11671167
y : Panel (new object)
11681168
"""
1169-
11701169
# construct the args
11711170
args = list(args)
1171+
aliases = tuple(kwargs.iterkeys())
1172+
11721173
for a in self._AXIS_ORDERS:
11731174
if not a in kwargs:
1174-
try:
1175-
kwargs[a] = args.pop(0)
1176-
except (IndexError):
1177-
raise ValueError(
1178-
"not enough arguments specified to transpose!")
1175+
where = map(a.startswith, aliases)
1176+
1177+
if any(where):
1178+
if sum(where) != 1:
1179+
raise AssertionError(
1180+
'Ambiguous parameter aliases "{0}" passed, valid '
1181+
'parameter aliases are '
1182+
'{1}'.format([n for n, m in zip(aliases, where)
1183+
if m], self._AXIS_ALIASES))
1184+
1185+
k = aliases[where.index(True)]
1186+
1187+
try:
1188+
kwargs[self._AXIS_ALIASES[k]] = kwargs.pop(k)
1189+
except KeyError:
1190+
raise KeyError('Invalid parameter alias '
1191+
'"{0}"'.format(k))
1192+
else:
1193+
try:
1194+
kwargs[a] = args.pop(0)
1195+
except IndexError:
1196+
raise ValueError(
1197+
"not enough arguments specified to transpose!")
11791198

11801199
axes = [self._get_axis_number(kwargs[a]) for a in self._AXIS_ORDERS]
11811200

pandas/tests/test_panel.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,30 @@ def test_transpose(self):
11401140
expected = self.panel.swapaxes('items', 'minor')
11411141
assert_panel_equal(result, expected)
11421142

1143+
# test kwargs
1144+
result = self.panel.transpose(items='minor', major='major',
1145+
minor='items')
1146+
expected = self.panel.swapaxes('items', 'minor')
1147+
assert_panel_equal(result, expected)
1148+
1149+
# text mixture of args
1150+
result = self.panel.transpose('minor', major='major', minor='items')
1151+
expected = self.panel.swapaxes('items', 'minor')
1152+
assert_panel_equal(result, expected)
1153+
1154+
result = self.panel.transpose('minor', 'major', minor='items')
1155+
expected = self.panel.swapaxes('items', 'minor')
1156+
assert_panel_equal(result, expected)
1157+
1158+
## test bad aliases
1159+
# test ambiguous aliases
1160+
self.assertRaises(AssertionError, self.panel.transpose, 'minor',
1161+
maj='major', majo='items')
1162+
1163+
# test invalid kwargs
1164+
self.assertRaises(KeyError, self.panel.transpose, 'minor',
1165+
maj='major', minor='items')
1166+
11431167
result = self.panel.transpose(2, 1, 0)
11441168
assert_panel_equal(result, expected)
11451169

0 commit comments

Comments
 (0)