如何排列列的值?

2024-04-20 15:23:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧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。我需要排列Suppy10以便将它们赋给Price的较高值,而Supply0应该出现在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

有什么线索吗?你知道吗


Tags: 数据dfdatetimeprice线索supply低值高值
3条回答

没有任何限制,除了你不能组合“供应”,排序每一个单独。我维护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

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

argsort

  • 用负数乘以1作为切换排序的方便方法
  • 使用argsort跟踪放置值的位置
  • 创建b来存放我的置换值
  • Supply的排序版本填充b
  • 分配回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

这段代码还有优化的余地,但总体思路是有的。你知道吗

相关问题 更多 >