Python DataFrame按日期滚动聚合:求和与交易ID拼接报错求助
解决Pandas滚动窗口拼接字符串报错问题
问题原因
Pandas的rolling.apply默认会将窗口内的数据视为数值类型处理,当对字符串类型的TRANSACTION ID执行拼接操作时,就会触发TypeError: must be real number, not str错误。
解决方案步骤
- 确保时间列是datetime类型:滚动窗口依赖时间索引,先转换时间列格式并按分组键+时间排序数据。
- 自定义字符串拼接函数:处理窗口内的交易ID,过滤空值后拼接成字符串。
- 调用rolling.apply时设置raw=False:让函数接收Series对象而非数值数组,避免强制类型转换。
完整代码示例
import pandas as pd # 预处理时间列并排序数据 df['TRANSACTION_DATE'] = pd.to_datetime(df['TRANSACTION_DATE']) df = df.sort_values(['EMPLOYEE ID', 'ACCOUNT EMAIL ADDRESS', 'TRANSACTION_DATE']) # 定义交易ID拼接函数 def concat_transaction_ids(window): # 过滤空值后转字符串拼接 valid_ids = [str(trans_id) for trans_id in window if pd.notna(trans_id)] return ','.join(valid_ids) # 按指定字段分组 grouped = df.groupby(['EMPLOYEE ID', 'ACCOUNT EMAIL ADDRESS']) # 计算已实现的滚动求和与计数 df['rollingSum'] = grouped['TRANSACTION AMOUNT'].rolling('11D', on='TRANSACTION_DATE').sum() df['rollingCnt'] = grouped['TRANSACTION ID'].rolling('11D', on='TRANSACTION_DATE').count() # 执行滚动窗口的交易ID拼接 df['rollingTransIds'] = grouped['TRANSACTION ID'].rolling('11D', on='TRANSACTION_DATE').apply( concat_transaction_ids, raw=False # 关键参数:传递Series而非数值数组 )
注意事项
- 必须确保分组后的每个组内数据按交易时间升序排列,否则滚动窗口的时间范围会计算错误。
- 如果
TRANSACTION ID本身就是字符串类型,可以去掉str()转换,直接拼接。
内容的提问来源于stack exchange,提问作者KBD
相关产品推荐
相关产品推荐

