熊猫按特定行对列进行排序

时间:2018-12-21 04:14:54

标签: python pandas sorting dataframe

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

例如,我的数据框是:

                            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'

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

1 个答案:

答案 0 :(得分:3)

实际上,您的代码可以在没有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