如何在Pandas中基于同名称分组行差值高效创建新列
Pandas 按分组差分计算的向量化实现方案
本方法为全向量化实现,无Python层循环,处理百万级以上数据仍有较高性能
实现逻辑
- 先将日期列转为datetime类型,避免字符串排序出现逻辑错误
- 按Name分组后,组内按日期升序排列,确保「上一次出现」的定义和时间顺序一致
- 用pandas内置的
groupby+diff方法直接计算组内相邻行Feature差值,每组首行的空差值直接填充0 - 最后按原索引恢复原始数据的行顺序即可
完整代码
import pandas as pd # 原始DataFrame df = pd.DataFrame({ "Name": [ "N1", "N2", "N3", "N1", "N1", "N2", "N3", "N2" ], "Date": [ "31-10-2021", "31-10-2021" , "31-10-2021", "15-10-2021", "14-10-2021", "13-10-2021", "12-10-2021", "11-10-2021" ], "Feature": [ 4, 5, 6, 3, 1, 6, 3, 3 ] }) # 转换日期格式保证排序正确 df['Date'] = pd.to_datetime(df['Date'], format='%d-%m-%Y') # 按名称+日期排序,保留原索引 df_sorted = df.sort_values(['Name', 'Date']).reset_index() # 分组计算差分,空值填充0 df_sorted['New_column'] = df_sorted.groupby('Name')['Feature'].diff().fillna(0).astype(int) # 恢复原始行顺序 df = df_sorted.sort_values('index').drop(columns='index').reset_index(drop=True) # 可选:把日期转回原始字符串格式 df['Date'] = df['Date'].dt.strftime('%d-%m-%Y')
执行后得到的df和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Ishigami
相关产品推荐
相关产品推荐

