Pandas有条件排序

yr9zkbsy  于 2023-01-11  发布在  其他
关注(0)|答案(1)|浏览(155)

假设我有以下 Dataframe :
| 价格|位置|日期时间|
| - ------| - ------| - ------|
| 三十|1个|2023年1月8日|
| 三十|四个|2023年1月8日|
| 一百四十|第二章|2023年1月9日|
| 一百四十|三个|2023年1月9日|
| 五十|1个|2023年1月9日|
| 五十|四个|2023年1月9日|
| 二百六十|第二章|2023年1月9日|
| 二百六十|三个|2023年1月9日|
Dataframe 具有升序排列的"位置"和"日期时间"。
我希望"position"(1和4)中的特定值在相同的"datetime"值中按降序排序,最终结果如下:
| 价格|位置|日期时间|
| - ------| - ------| - ------|
| 三十|四个|2023年1月8日|
| 三十|1个|2023年1月8日|
| 一百四十|第二章|2023年1月9日|
| 一百四十|三个|2023年1月9日|
| 五十|四个|2023年1月9日|
| 五十|1个|2023年1月9日|
| 二百六十|第二章|2023年1月9日|
| 二百六十|三个|2023年1月9日|
我试过这个密码

df_trade = df_trade[df_trade.position == 4 or df_trade.position == 1].sort_values(by = ["position"], ascending = False)

但它给了
ValueError:Series的真值不明确。请使用. empty、. bool()、. item()、. any()或. all()。
我想一定有更好更简单的方法。

nfs0ujit

nfs0ujit1#

numpy.lexsort与使用负值1/4的“位置”系列一起使用:

import numpy as np

order = np.lexsort([df['position'].mul(np.where(df['position'].isin([1,4]), -1, 1)), df['datetime']])

out = df.iloc[order]

Pandas等效物:

(df.assign(key=df['position'].mul(np.where(df['position'].isin([1,4]), -1, 1)))
   .sort_values(by=['datetime', 'key'])
   .drop(columns='key')
 )

输出:

price  position    datetime
1     30         4  2023-01-08
0     30         1  2023-01-08
5     50         4  2023-01-09
4     50         1  2023-01-09
2    140         2  2023-01-09
6    260         2  2023-01-09
3    140         3  2023-01-09
7    260         3  2023-01-09

相关问题