【发布时间】:2021-07-22 14:41:09
【问题描述】:
我有以下数据框(我们称之为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 |
并且我想为每个id 获取每个valX 列的A 和B (A-B) 类型之间的差异,即我希望结果是:
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')
然后合并结果得到我要找的东西。
有没有更有效的方法来做到这一点?最后,我想将一个函数应用于分组数据框的列的子集,但该函数必须考虑另一列的值。
【问题讨论】:
-
是否总是
A和B每id?会有重复的As 或Bs 吗?
标签: python pandas dataframe pandas-groupby apply