Python DataFrame按日期滚动求和报错:KeyError与重复问题排查
解决员工交易数据滚动求和的KeyError及重复索引问题
错误原因分析
- KeyError: 'EMPLOYEE ID':要么是把
TRANSACTION DATE设为索引后,分组所需的列被移出了数据框常规列;要么是列名拼写/大小写和数据实际列名不匹配(比如数据里是小写employee id,代码里用了大写)。 - 重复索引错误:将日期设为索引时,同一日期存在多条交易记录,导致索引重复,后续分组或滚动操作触发报错。
分步解决方案
1. 数据预处理(避开索引陷阱)
不要直接把日期列设为索引,先转成datetime格式,再按分组键+日期排序——这是滚动窗口计算的必要前提:
import pandas as pd # 读入交易数据 df = pd.read_csv('你的交易数据文件.csv') # 将日期列转换为datetime格式,格式根据你的实际数据调整,比如'%Y/%m/%d' df['TRANSACTION DATE'] = pd.to_datetime(df['TRANSACTION DATE'], format='%Y-%m-%d') # 按分组字段+日期排序,确保滚动计算的顺序正确 df = df.sort_values(by=['EMPLOYEE ID', 'ACCOUNT EMAIL ADDRESS', 'ACCOUNT NUMBER', 'MERCHANT NAME', 'TRANSACTION DATE'])
2. 正确分组计算10天滚动总和
用groupby指定全部分组键,滚动窗口计算时通过on='TRANSACTION DATE'指定日期列,无需修改索引:
# 定义分组字段列表 group_cols = ['EMPLOYEE ID', 'ACCOUNT EMAIL ADDRESS', 'ACCOUNT NUMBER', 'MERCHANT NAME'] # 计算过去10天(包含当前交易当天)的交易金额总和 df['ROLLING_10D_TOTAL'] = df.groupby(group_cols).rolling( window='10D', on='TRANSACTION DATE', closed='both' )['TRANSACTION AMOUNT'].sum().reset_index(drop=True)
额外排查点
- 核对列名:直接查看数据,确认
EMPLOYEE ID、TRANSACTION AMOUNT等列名完全匹配,包括空格、大小写细节。 - 去重处理:如果同一分组+同一日期存在完全重复的交易记录,先去重再计算:
df = df.drop_duplicates(subset=group_cols + ['TRANSACTION DATE', 'TRANSACTION AMOUNT'], keep='first') - 调整窗口范围:若需要“过去10天不含当天”,将
closed='both'改为closed='left'。
内容的提问来源于stack exchange,提问作者KBD
相关产品推荐
相关产品推荐

