我有以下DataFrame df
:
Datetime Supply Price
2019-02-01 12:00 10 2.0
2019-02-01 12:00 10 1.0
2019-02-01 12:00 0 5.0
2019-02-01 12:00 10 1.0
2019-02-01 12:00 0 2.0
2019-02-01 12:00 10 4.0
2019-02-01 12:00 0 5.0
Supply
的总和为40。我需要置换Suppy
10才能将它们分配给较高的Price
值,而Supply
0应该出现在较低的值上值Price
。
这是预期的结果:
Datetime Supply Price
2019-02-01 12:00 10 2.0
2019-02-01 12:00 0 1.0
2019-02-01 12:00 10 5.0
2019-02-01 12:00 0 1.0
2019-02-01 12:00 0 2.0
2019-02-01 12:00 10 4.0
2019-02-01 12:00 10 5.0
有什么线索吗?
答案 0 :(得分:3)
argsort
argsort
跟踪放置值的位置b
来容纳我的排列值b
的排序版本填充Supply
df
a = df.Price.mul(-1).to_numpy().argsort()
b = np.empty_like(df.Supply)
b[a] = df.Supply.sort_values(ascending=False)
df.loc[:, 'Supply'] = b
df
Datetime Supply Price
0 2019-02-01 12:00 10 2.0
1 2019-02-01 12:00 0 1.0
2 2019-02-01 12:00 10 5.0
3 2019-02-01 12:00 0 1.0
4 2019-02-01 12:00 0 2.0
5 2019-02-01 12:00 10 4.0
6 2019-02-01 12:00 10 5.0
有优化此代码的空间,但总的思路就在那里。
答案 1 :(得分:2)
除了不能组合“ Supply”以外,没有其他约束,请分别对每个排序。我维护Datetime和Price的行绑定,如果它们不是同一日期,这将很明显:
pd.concat([df['Supply'].sort_values().reset_index(drop=True),
df[['Datetime', 'Price']].sort_values('Price').reset_index(drop=True)],
axis=1)
Supply Datetime Price
0 0 2019-02-01 12:00 1.0
1 0 2019-02-01 12:00 1.0
2 0 2019-02-01 12:00 2.0
3 10 2019-02-01 12:00 2.0
4 10 2019-02-01 12:00 4.0
5 10 2019-02-01 12:00 5.0
6 10 2019-02-01 12:00 5.0
答案 2 :(得分:1)
如果您按df
对Price
进行排序,然后将Supply
更改为排序后的供给值,那么它应该可以满足我的要求。
df = pd.DataFrame({'Supply':[10,10,0,10,0,10,0],
'Price': [2., 1.,5.,1.,2.,4.,5.]})
df.sort_values('Price', inplace=True)
df['Supply'] = df['Supply'].sort_values().values
Supply Price
1 0 1.00
3 0 1.00
0 0 2.00
4 10 2.00
5 10 4.00
2 10 5.00
6 10 5.00
如果需要,您可以重新排序以恢复原始顺序。
df.sort_index(inplace=True)
Supply Price
0 0 2.00
1 0 1.00
2 10 5.00
3 0 1.00
4 10 2.00
5 10 4.00
6 10 5.00