商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 计算 Pandas 中按多列分组后的列差值(diff)

计算 Pandas 中按多列分组后的列差值(diff)

  发布于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]
})

执行上述代码后,输出结果如下:

TimeProp1Prop2Prop2Diff
1A4NaN
2B5NaN
3A1NaN
1A51.0
2B4-1.0
3B3NaN

这里有个关键点需要警惕:分组逻辑严格依赖于原始数据的物理顺序。如果数据没有按 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 高度优化的向量化操作实现,性能提升可达数十倍。在处理百万级数据时,这绝对是一个值得养成的习惯。

本文转载于:https://www.php.cn/faq/2334470.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注