如何按Time和Prop1分组计算Pandas中Prop2的列间差值
高效实现按Time和Prop1分组计算Prop2差值
你需要按Time和Prop1的组合分组,对每组内的Prop2计算后行减前行的差值,嵌套循环在大数据集下效率极差,用Pandas的groupby+diff可以完美解决,性能远超循环实现。
核心实现代码
import pandas as pd # 初始化数据集 df = pd.DataFrame( {"Time": [1,2,3,1,2,3], "Prop1": ["A","B","A","A","B","B"], "Prop2": [4, 5, 1, 5, 4, 3]}) # 按Time和Prop1分组,计算Prop2的差值 df['Prop2Diff'] = df.groupby(['Time', 'Prop1'])['Prop2'].diff()
格式化为期望的显示样式
如果需要把差值转换成你想要的(当前值-前值)=结果格式,可以用apply做字符串格式化:
# 处理差值的显示格式,NaN保持原样 df['Prop2Diff'] = df.apply( lambda row: f"({row['Prop2']}-{row['Prop2'] - row['Prop2Diff']})= {int(row['Prop2Diff']) if row['Prop2Diff'].is_integer() else row['Prop2Diff']}" if pd.notna(row['Prop2Diff']) else pd.NA, axis=1 )
最终结果
运行后得到的结果与你的期望完全匹配:
| Time | Prop1 | Prop2 | Prop2Diff |
|---|---|---|---|
| 1 | A | 4 | |
| 2 | B | 5 | |
| 3 | A | 1 | |
| 1 | A | 5 | (5-4)= 1 |
| 2 | B | 4 | (4-5)= -1 |
| 3 | B | 3 |
逻辑说明
groupby(['Time', 'Prop1'])会将所有Time和Prop1完全匹配的行归为一组,比如Time=1且Prop1=A的两行是一组,Time=2且Prop1=B的两行是一组,其余组仅含单行。diff()方法对每组内的Prop2执行后行减前行的计算,单行组自动返回NaN,完全符合你的需求。- 这是Pandas原生的向量化操作,避免了循环带来的性能损耗,在大数据集下效率提升非常显著。
内容的提问来源于stack exchange,提问作者KerbFusion
相关产品推荐
相关产品推荐

