如何在pandas DataFrame中按另一列条件对指定列应用.diff()生成新列
Pandas按产品分组计算相邻采购价差值实现方案
核心实现逻辑
因为你已经提前按产品、日期完成排序,直接对产品列分组后调用diff()即可,groupby会限制差值计算仅在同一个产品的组内执行,产品切换的行默认返回空值,完美匹配需求。
代码实现
场景1:产品切换行保留空值(符合统计逻辑,首行无前置对比数据默认留空)
import pandas as pd import numpy as np df=pd.DataFrame({'A':['Shrimp', 'Shrimp', 'Shrimp','Octopus','Octopus','Fish','Fish'], 'B':[10,11,15,25,30,5,15]}) # 按产品A分组后对价格B计算差值 df['C'] = df.groupby('A')['B'].diff()
运行后输出结果:
| A | B | C |
|---|---|---|
| Shrimp | 10 | NaN |
| Shrimp | 11 | 1.0 |
| Shrimp | 15 | 4.0 |
| Octopus | 25 | NaN |
| Octopus | 30 | 5.0 |
| Fish | 5 | NaN |
| Fish | 15 | 10.0 |
场景2:产品切换行差值设为0(匹配你原代码的else分支逻辑)
仅需在diff后追加fillna(0)即可:
df['C'] = df.groupby('A')['B'].diff().fillna(0)
运行后输出结果:
| A | B | C |
|---|---|---|
| Shrimp | 10 | 0.0 |
| Shrimp | 11 | 1.0 |
| Shrimp | 15 | 4.0 |
| Octopus | 25 | 0.0 |
| Octopus | 30 | 5.0 |
| Fish | 5 | 0.0 |
| Fish | 15 | 10.0 |
原代码问题说明
你写的lambda表达式是单行判断逻辑,无法直接作用于整个DataFrame对象,执行会报错。groupby是Pandas处理分组内运算的标准实现,性能和可读性都远高于逐行判断方案。
内容的提问来源于stack exchange,提问作者Hector Rojo
相关产品推荐
相关产品推荐

