如何排列pandas栏的值?

时间:2019-06-14 19:55:19

标签: python pandas

我有以下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

有什么线索吗?

3 个答案:

答案 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)

如果您按dfPrice进行排序,然后将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