You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python DataFrame按日期滚动聚合:求和与交易ID拼接报错求助

解决Pandas滚动窗口拼接字符串报错问题

问题原因

Pandas的rolling.apply默认会将窗口内的数据视为数值类型处理,当对字符串类型的TRANSACTION ID执行拼接操作时,就会触发TypeError: must be real number, not str错误。

解决方案步骤

  1. 确保时间列是datetime类型:滚动窗口依赖时间索引,先转换时间列格式并按分组键+时间排序数据。
  2. 自定义字符串拼接函数:处理窗口内的交易ID,过滤空值后拼接成字符串。
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.06 13:17:01