已更新
我有一个如下所示的 df:
print(df)
id rank a
date
2000-01-01 1 1.0 0
2000-01-01 2 3.0 0
2000-01-01 3 2.0 0
2000-01-01 4 0.0 0
2000-01-02 1 2.0 0
2000-01-02 2 3.0 0
2000-01-02 3 2.0 0
2000-01-02 4 1.0 0
2000-01-03 1 3.0 0
2000-01-03 2 2.0 0
2000-01-03 3 1.0 0
2000-01-03 4 1.0 0
我想创建一个新变量 a 如果 rank 与上个月相比发生变化,该变量等于 1。例如,在 2000-01-01 rank 中为 3.0,在 2000-01-02 中变为 2.0。我希望此更改与 a 中的 1 相对应,如果没有更改,则保持 0。我也想按 id 进行分组。此外,等级在每个时期只能增加 1。
预期输出
id rank a
date
2000-01-01 1 1.0 1
2000-01-01 2 3.0 1
2000-01-01 3 2.0 1
2000-01-01 4 0.0 1
2000-01-02 1 2.0 1
2000-01-02 2 3.0 0
2000-01-02 3 2.0 0
2000-01-02 4 1.0 1
2000-01-03 1 3.0 1
2000-01-03 2 2.0 1
2000-01-03 3 1.0 1
2000-01-03 4 1.0 0
任何帮助都会很棒!
请您参考如下方法:
使用Series.diff与 Series.abs如果可能的话,差异更像 1 使用 Series.clip :
df['a'] = df['rank'].diff().abs().clip(upper=1)
如果差异总是只有1:
df['a'] = df['rank'].diff().abs()
如果需要第一个值设置为0:
df['a'] = df['rank'].diff().fillna(0).ne(0).astype(int)
编辑后的答案:
df['a1'] = df.groupby('id')['rank'].diff().ne(0).astype(int)
print (df)
date id rank a a1
0 2000-01-01 1 1.0 1 1
1 2000-01-01 2 3.0 1 1
2 2000-01-01 3 2.0 1 1
3 2000-01-01 4 0.0 1 1
4 2000-01-02 1 2.0 1 1
5 2000-01-02 2 3.0 0 0
6 2000-01-02 3 2.0 0 0
7 2000-01-02 4 1.0 1 1
8 2000-01-03 1 3.0 1 1
9 2000-01-03 2 2.0 1 1
10 2000-01-03 3 1.0 1 1
11 2000-01-03 4 1.0 0 0
