发布于2026-07-17 阅读(0)
扫一扫,手机访问
做数据分析时,你一定遇到过这样的场景:需要根据多个条件(比如时间点和类别标签)来分组,然后在每组内部计算某个数值列的逐行变化量。举个例子,在时序实验或分组观测中,我们只关心同一时刻、同一属性下的样本序列,想看看某个指标(比如 Prop2)是怎么一步步变化的——是上升了还是下降了?这种“按组差分”的需求,正是 groupby(...).diff() 大显身手的地方。
核心方法极其简洁,一行代码就能搞定:
df['Prop2Diff'] = df.groupby(['Time', 'Prop1'])['Prop2'].diff()
这条语句做了什么?首先按 ['Time', 'Prop1'] 两列联合分组,确保每个组里的记录拥有完全一致的时间和属性标识;然后在每组内部,对 Prop2 列执行 .diff() 操作(即当前行值减去上一行值),自动保留原始行顺序。每组的第一行因为没有前一行可减,结果自然就是 NaN。
来看一个具体的例子:
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 | Prop2Diff |
|---|---|---|---|
| 1 | A | 4 | NaN |
| 2 | B | 5 | NaN |
| 3 | A | 1 | NaN |
| 1 | A | 5 | 1.0 |
| 2 | B | 4 | -1.0 |
| 3 | B | 3 | NaN |
这里有个关键点需要警惕:分组逻辑严格依赖于原始数据的物理顺序。如果数据没有按 Time 或 Prop1 排序,同组的记录可能被分散在不同位置,导致 .diff() 作用在非连续的行上,结果自然就不对了。所以,如果业务要求按时间顺序计算差值,最好先主动排个序:
df = df.sort_values(['Time', 'Prop1']).reset_index(drop=True) df['Prop2Diff'] = df.groupby(['Time', 'Prop1'])['Prop2'].diff()
另外,.diff() 还支持一个参数 periods(默认值为1),可以用来计算跨 n 行的差值。比如 diff(periods=2) 得到的是当前行与前两行的差。如果需要绝对差值,后面再链式调用 .abs() 即可。
总而言之,用 groupby([...])[col].diff() 替代嵌套循环,不仅代码更简洁、可读性更强,而且底层由 pandas 高度优化的向量化操作实现,性能提升可达数十倍。在处理百万级数据时,这绝对是一个值得养成的习惯。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8