pandas python 中的数据操作

pandas data manipulation in python

我有一个包含列 IDN1 的数据框 df,我想计算列 N2,逻辑第一个值应等于 N1对于每个 ID,下一个值是 0.888/0.999 等等。下一个 ID 也类似。我们可以在 pandas

中不使用 for 循环来做到这一点吗
ID  N1  N2
1111    0.999   0.999
1111    0.888   0.888888889
1111    0.777   0.875
1111    0.666   0.857142857
1111    0.555   0.833333333
1111    0.444   0.8
1111    0.333   0.75
2222    0.998   0.998
2222    0.887   0.888777555
2222    0.776   0.874859076
2222    0.665   0.856958763
2222    0.554   0.833082707
2222    0.443   0.799638989
2222    0.332   0.749435666
2222    0.221   0.665662651

是的,您可以使用 groupby()transform()shift(),然后使用 fillna(1) 来允许第一个值。

df['N2'] = df.groupby("ID")['N1'].transform(lambda x: x/x.shift(1).fillna(1))
df

      ID     N1        N2
0   1111  0.999  0.999000
1   1111  0.888  0.888889
2   1111  0.777  0.875000
3   1111  0.666  0.857143
4   1111  0.555  0.833333
5   1111  0.444  0.800000
6   1111  0.333  0.750000
7   2222  0.998  0.998000
8   2222  0.887  0.888778
9   2222  0.776  0.874859
10  2222  0.665  0.856959
11  2222  0.554  0.833083
12  2222  0.443  0.799639
13  2222  0.332  0.749436
14  2222  0.221  0.665663

这是1加上百分比变化

df.assign(N2=df.groupby('ID').N1.pct_change().add(1).fillna(df.N1))

      ID     N1        N2
0   1111  0.999  0.999000
1   1111  0.888  0.888889
2   1111  0.777  0.875000
3   1111  0.666  0.857143
4   1111  0.555  0.833333
5   1111  0.444  0.800000
6   1111  0.333  0.750000
7   2222  0.998  0.998000
8   2222  0.887  0.888778
9   2222  0.776  0.874859
10  2222  0.665  0.856959
11  2222  0.554  0.833083
12  2222  0.443  0.799639
13  2222  0.332  0.749436
14  2222  0.221  0.665663