我有一个像这样的 Pandas 数据框:
date id tier
0 2020-06-02 23 3
1 2020-06-02 23 2
2 2020-06-02 23 1
3 2020-06-02 7 3
23026 2020-06-20 7 3
41740 2020-07-07 9 3
我想从“tier”创建一个新列,如果以前的值与当前值相同或没有以前的值,则值为 0;如果以前的值大于当前值,则值为 1,并且 - 1 其他情况,如下所示:
date id tier move
0 2020-06-02 23 3 0
1 2020-06-02 23 2 1
2 2020-06-02 23 1 1
3 2020-06-02 23 3 -1
23026 2020-06-20 7 3 0
41740 2020-07-07 9 3 0
我主要尝试过 .shift() ,按照我的答案,但无济于事。当我这样做时:
if df['tier'].shift() < df['tier']:
df['Movement'] = -1
elif df['tier'].shift() == df['tier']:
df['Movement'] = 0
else:
df['Movement'] = 1
它提示 DF 不是相同的形状“ValueError:操作数无法与形状 (78792,) (385,2) 一起广播” 但是只有一个 df 正在使用,不知道我的代码是否不好或者(385,2)来自哪里 谢谢!
最佳答案
使用numpy.select
:
import numpy as np
conditions=[df['tier'].shift().fillna(df['tier']).eq(df['tier']),
df['tier'].shift().fillna(df['tier']).gt(df['tier'])]
choices=[0,1]
df['move']=np.select(conditions, choices, default=-1)
输出:
df
date id tier move
0 2020-06-02 23 3 0
1 2020-06-02 23 2 1
2 2020-06-02 23 1 1
3 2020-06-02 7 3 -1
23026 2020-06-20 7 3 0
41740 2020-07-07 9 3 0
关于python - 比较 panda 数据框中的值并返回新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63379298/