虚拟数据:
df = pd.DataFrame({'id': [1, 1, 1, 2, 2, 2],
'num': [12, 14, 18, 10, 10 ,11]})
现在,我想为每个num
计算id
的梯度。因此:
df.groupby(['id'])['num'].apply(np.gradient).explode()
但是,我不确定如何保留原始索引。我想出的解决方法很丑陋,我想知道是否有更好的方法。
df['gradient'] = df.groupby(['id'])['num'].apply(np.gradient).explode()\
.reset_index().set_index(df.index)['num']
哪个会产生所需的结果:
id num gradient
0 1 12 2.0
1 1 14 3.0
2 1 18 4.0
3 2 10 0.0
4 2 10 0.5
5 2 11 1.0
答案 0 :(得分:2)
groupby().transform
似乎可以做到:
df['gradient'] = df.groupby(['id'])['num'].transform(np.gradient)
输出:
id num gradient
0 1 12 2.0
1 1 14 3.0
2 1 18 4.0
3 2 10 0.0
4 2 10 0.5
5 2 11 1.0