Skip to content

Commit 970e25b

Browse files
committed
DataFrame sort columns by rows: sort_values(axis=1)
Fixes #10806
1 parent 65849d3 commit 970e25b

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

pandas/core/frame.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -3127,9 +3127,8 @@ def sort_values(self, by, axis=0, ascending=True, inplace=False,
31273127
kind='quicksort', na_position='last'):
31283128

31293129
axis = self._get_axis_number(axis)
3130+
other_axis = 0 if axis == 1 else 1
31303131

3131-
if axis != 0:
3132-
raise ValueError('When sorting by column, axis must be 0 (rows)')
31333132
if not isinstance(by, list):
31343133
by = [by]
31353134
if com.is_sequence(ascending) and len(by) != len(ascending):
@@ -3145,7 +3144,7 @@ def trans(v):
31453144

31463145
keys = []
31473146
for x in by:
3148-
k = self[x].values
3147+
k = self.xs(x, axis=other_axis).values
31493148
if k.ndim == 2:
31503149
raise ValueError('Cannot sort by duplicate column %s' %
31513150
str(x))
@@ -3157,7 +3156,7 @@ def trans(v):
31573156
from pandas.core.groupby import _nargsort
31583157

31593158
by = by[0]
3160-
k = self[by].values
3159+
k = self.xs(by, axis=other_axis).values
31613160
if k.ndim == 2:
31623161

31633162
# try to be helpful

pandas/tests/frame/test_sorting.py

+20-4
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def test_sort_values(self):
8484
frame = DataFrame([[1, 1, 2], [3, 1, 0], [4, 5, 6]],
8585
index=[1, 2, 3], columns=list('ABC'))
8686

87-
# by column
87+
# by column (axis=0)
8888
sorted_df = frame.sort_values(by='A')
8989
indexer = frame['A'].argsort().values
9090
expected = frame.ix[frame.index[indexer]]
@@ -116,9 +116,25 @@ def test_sort_values(self):
116116
self.assertRaises(ValueError, lambda: frame.sort_values(
117117
by=['A', 'B'], axis=2, inplace=True))
118118

119-
msg = 'When sorting by column, axis must be 0'
120-
with assertRaisesRegexp(ValueError, msg):
121-
frame.sort_values(by='A', axis=1)
119+
# by row (axis=1): GH 10806
120+
sorted_df = frame.sort_values(by=3, axis=1)
121+
expected = frame
122+
assert_frame_equal(sorted_df, expected)
123+
124+
sorted_df = frame.sort_values(by=3, axis=1, ascending=False)
125+
expected = frame.reindex(columns=['C', 'B', 'A'])
126+
assert_frame_equal(sorted_df, expected)
127+
128+
sorted_df = frame.sort_values(by=[1, 2], axis=1)
129+
expected = frame.reindex(columns=['B', 'A', 'C'])
130+
assert_frame_equal(sorted_df, expected)
131+
132+
sorted_df = frame.sort_values(by=[1, 3], axis=1, ascending=[True, False])
133+
assert_frame_equal(sorted_df, expected)
134+
135+
sorted_df = frame.sort_values(by=[1, 3], axis=1, ascending=False)
136+
expected = frame.reindex(columns=['C', 'B', 'A'])
137+
assert_frame_equal(sorted_df, expected)
122138

123139
msg = r'Length of ascending \(5\) != length of by \(2\)'
124140
with assertRaisesRegexp(ValueError, msg):

0 commit comments

Comments
 (0)