首页 > 解决方案 > Pandas 按特定行对列进行排序

问题描述

我有一个带有日期时间索引的数据框,我想用最后一个日期时间进行排序。

例如,我的数据框是:

                            A       B       C       D
2018-12-05 20:12:10       48.58   50.81   46.71   48.18
2018-12-05 20:11:49       54.43   45.08   48.67   49.72
2018-12-05 20:11:41       49.86   52.40   48.47   50.02

我想这样排序:

                            B       A       D       C
2018-12-05 20:12:10       50.81   48.58   48.18   46.71
2018-12-05 20:11:49       45.08   54.43   49.72   48.67
2018-12-05 20:11:41       52.40   49.86   50.02   48.47

我试过了:

df.sort_values(by=df.iloc[0],ascending=False,inplace=True)df.sort_values(by=df.index[0],ascending=False,inplace=True)

我收到错误消息:“Exeption Unhandled Timestamp('2018-12-05 20:12:10')”

我也试过:

df.sort_values(by=df.iloc[0],ascending=False,inplace=True, axis=1)df.sort_values(by=df.index[0],ascending=False,inplace=True, axis=1)

我得到了回报:“无”

我的索引类型是“datetime64”

任何提示将不胜感激。谢谢!

标签: pythonpandassortingdataframe

解决方案


实际上,您的代码将在没有inplace参数的情况下工作:

df.sort_values(by=df.index[0], ascending=False, axis=1)

                         B      A      D      C
2018-12-05 20:12:10  50.81  48.58  48.18  46.71
2018-12-05 20:11:49  45.08  54.43  49.72  48.67
2018-12-05 20:11:41  52.40  49.86  50.02  48.47

作为另一种选择,您可以argsort在此处利用:

df.iloc[:, (-df.iloc[0, :]).argsort()]

                         B      A      D      C
2018-12-05 20:12:10  50.81  48.58  48.18  46.71
2018-12-05 20:11:49  45.08  54.43  49.72  48.67
2018-12-05 20:11:41  52.40  49.86  50.02  48.47

或者,

df.iloc[:, np.argsort(-df.values[0])]

                         B      A      D      C
2018-12-05 20:12:10  50.81  48.58  48.18  46.71
2018-12-05 20:11:49  45.08  54.43  49.72  48.67
2018-12-05 20:11:41  52.40  49.86  50.02  48.47

另一种方法(效率稍低的是使用sort_values(ascending=False)和使用索引进行标签选择:

df[df.iloc[0, :].sort_values(ascending=False).index]

                         B      A      D      C
2018-12-05 20:12:10  50.81  48.58  48.18  46.71
2018-12-05 20:11:49  45.08  54.43  49.72  48.67
2018-12-05 20:11:41  52.40  49.86  50.02  48.47

推荐阅读