我看到了这个问题的原始版本here
但是我的数据框名称不同,我想分别为它们计算
A B C
0 a 3 5
1 a 6 9
2 b 3 8
3 b 11 19
我想对A进行分组,然后找到备用B和C之间的差异。
A B C dA
0 a 3 5 6
1 a 6 9 NaN
2 b 3 8 16
3 b 11 19 NaN
我尝试做
df['dA']=df.groupby('A')(['C']-['B'])
df['dA']=df.groupby('A')['C']-df.groupby('A')['B']
他们都没有帮助 我在犯什么错误?
答案 0 :(得分:0)
IIUC,这是执行计算的一种方法:
# create the data frame
from io import StringIO
import pandas as pd
data = '''idx A B C
0 a 3 5
1 a 6 9
2 b 3 8
3 b 11 19
'''
df = pd.read_csv(StringIO(data), sep='\s+', engine='python').set_index('idx')
现在,计算dA
。我查看了C的最后一个值减去B的第一个值(按A分组)(是对吗?还是max(C)减去min(B)?)。如果可以确保A值成对出现,那么@BenT的shift()
会更简洁。
dA = (
(df.groupby('A')['C'].transform('last') -
df.groupby('A')['B'].transform('first'))
.drop_duplicates()
.rename('dA'))
print(pd.concat([df, dA], axis=1))
A B C dA
idx
0 a 3 5 6.0
1 a 6 9 NaN
2 b 3 8 16.0
3 b 11 19 NaN
我使用groupby().transform()
来保留索引值,以支持concat
操作。