python中的pandas数据操作

时间:2017-04-05 20:07:29

标签: python-3.x pandas data-manipulation

我有一个数据框df,列IDN1,我想计算列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

2 个答案:

答案 0 :(得分:5)

这是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

答案 1 :(得分:3)

是的,您可以使用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