Skip to main content
 首页 » 编程设计

python之根据滞后/变化的变量创建新列

2025年05月04日13bjzhanghao

已更新

我有一个如下所示的 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