我有以下数据框(我们称之为data
):
id | type | val1 | val2 |
-------------------------
1 | A | 10.1 | 11.0 |
1 | B | 10.5 | 11.2 |
2 | A | 10.7 | 10.9 |
2 | B | 10.6 | 11.1 |
3 | A | 10.3 | 10.5 |
3 | B | 10.4 | 11.3 |
并且我想获得每一列的类型A
和B
(A
- B
)之间的差异,即我希望结果是:id
valX
id | val1 | val2 |
------------------
1 | -0.4 | -0.2 |
2 | 0.1 | -0.2 |
3 | -0.1 | -0.8 |
我能做到这一点的唯一方法是定义一个函数:
def getDelta(df, valName):
return df[ df['type']=='A' ][valName].values[0] - df[ df['type']=='B' ][valName].values[0]
并将其分别应用于每一列:
data.groupby('id').apply(getDelta,valName='val1')
然后合并结果以获得我想要的。
有没有更有效的方法来做到这一点?最后,我想将一个函数应用于分组数据帧的列的子集,但该函数必须考虑另一列的值。
就目前而言,您可以使用np.subtract.reduce
,假设在所有情况下 'A' 出现在 'B' 之前,并且没有重复项:
df.groupby("id", sort = False).agg(np.subtract.reduce).reset_index()
id val1 val2
0 1 -0.4 -0.2
1 2 0.1 -0.2
2 3 -0.1 -0.8
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句