Pandas按行排序列顺序

4

给定以下数据框:

df = pd.DataFrame({'A' : ['1','2','3','7'],
                   'B' : [7,6,5,4],
                   'C' : [5,6,7,1],
                   'D' : [1,9,9,8]})
df=df.set_index('A')
df

    B   C   D
A           
1   7   5   1
2   6   6   9
3   5   7   9
7   4   1   8

我想要按照底部行的顺序将列按降序排列,如下所示:
    D   B   C
A           
1   1   7   5
2   9   6   6
3   9   5   7
7   8   4   1

谢谢你的提前帮忙!
3个回答

3
最简单的方法是转置,然后进行 sort_values 操作,最后再转置回来。
df.T.sort_values('7', ascending=False).T

或者

df.T.sort_values(df.index[-1], ascending=False).T

给出:

   D  B  C
A         
1  1  7  5
2  9  6  6
3  9  5  7
7  8  4  1

测试

我的解决方案

%%timeit
df.T.sort_values(df.index[-1], ascending=False).T

1000 loops, best of 3: 444 µs per loop

替代方案
%%timeit
df[[c for c in sorted(list(df.columns), key=df.iloc[-1].get, reverse=True)]]

1000 loops, best of 3: 525 µs per loop

我能否在不明确引用值“7”的情况下完成它? - Dance Party2
它总是最后一行吗? - piRSquared
是的,它将永远如此。 - Dance Party2
不错的解决方案,但对于大型数据框可能效率较低。 - hilberts_drinking_problem

3

您可以使用带有axis=1的sort_values(按行的索引位置):

df.sort_values(by=df.index[-1],axis=1,inplace=True)

2
这里有一种不涉及转置的变体:

这个变体不需要进行转置:

df = df[[c for c in sorted(list(df.columns), key=df.iloc[-1].get, reverse=True)]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接