如何在Pandas中按B分组计算不同block间C列的差值?
按分组计算不同block的C列差值
原始数据
定义的DataFrame如下:
import pandas as pd df = pd.DataFrame({'block': [1, 1, 1, 2, 2, 2, 3, 3, 3], 'B': ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'], 'C': [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000], })
输出的原始表格:
block B C 0 1 a 1000 1 1 b 2000 2 1 c 3000 3 2 a 4000 4 2 b 5000 5 2 c 6000 6 3 a 7000 7 3 b 8000 8 3 c 9000
需求
生成diff_column,按B列分组后,计算当前block对应C值与前一个block对应C值的差值。例如block2中a的C值4000减去block1中a的C值1000,结果为3000;block1的行无前置block,差值留空。
错误尝试
用户尝试的代码无法得到正确结果:
df['diff_column'] = df.groupby(['block', 'B'])['C'] - df.shift[-1].groupby(['block', 'B'])['C']
正确解法
核心思路是仅按B列分组,因为同一B值的行按block顺序排列,使用diff()方法即可计算当前行与前一行的差值:
df['diff_column'] = df.groupby('B')['C'].diff()
执行后得到的结果:
block B C diff_column 0 1 a 1000 NaN 1 1 b 2000 NaN 2 1 c 3000 NaN 3 2 a 4000 3000.0 4 2 b 5000 3000.0 5 2 c 6000 3000.0 6 3 a 7000 3000.0 7 3 b 8000 3000.0 8 3 c 9000 3000.0
说明
之前的错误在于同时按block和B分组,每个分组仅包含一行数据,无法计算差值。而仅按B分组后,每组内的行按block顺序排列,diff()方法会自动处理前一行的取值,block1的行因无前置行,自然得到NaN,完全符合需求。
内容的提问来源于stack exchange,提问作者Luiz Scheuer
相关产品推荐
相关产品推荐

