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

Python数据转换与EDA问题:单txn_id出现多行结果排查

问题解决:单个txn_id对应多行的pandas数据处理修正

问题根源

  1. 分组内数据未按时间排序:如果原始数据没有按时间顺序排列,iloc[-1]和iloc[-6:-1]无法精准获取最新值及目标历史数据,逻辑上会出现偏差。
  2. 未处理数据量不足的分组:若某个txn_id的记录数少于6条,iloc[-6:-1]返回的序列长度不足5,导致生成的列表长度不一致,最终引发DataFrame构造异常或非预期多行。
  3. 列名笔误:代码中列名min_am应为min_amt,属于低级错误。

修正后的代码

import pandas as pd

# 读取数据,假设存在时间列`date`用于排序(无时间列需确认原始数据排序逻辑)
df = pd.read_excel('data.xlsx')

# 按txn_id分组后,每组内按时间升序排序,确保最新数据在分组末尾
df_sorted = df.sort_values(by=['txn_id', 'date'], ascending=[True, True])

output = []
grouped = df_sorted.groupby('txn_id')

for txn_id, group in grouped:
    # 获取最新的avg和min金额,处理分组为空的极端情况
    latest_avg = group['avg_amount'].iloc[-1] if len(group) >= 1 else None
    latest_min = group['min_amount'].iloc[-1] if len(group) >= 1 else None
    
    # 提取过去5期的avg数据,不足5条则补NaN
    lm_avg = group['avg_amount'].iloc[-6:-1].tolist()
    lm_avg = [None] * (5 - len(lm_avg)) + lm_avg
    
    # 提取过去5期的min数据,同样补全长度
    min_amt_list = group['min_amount'].iloc[-6:-1].tolist()
    min_amt_list = [None] * (5 - len(min_amt_list)) + min_amt_list
    
    # 拼接成单行数据加入结果列表
    output.append([txn_id, *lm_avg, latest_min, *min_amt_list])

# 生成结果DataFrame,修正列名错误
result_df = pd.DataFrame(
    output,
    columns=[
        'txn_id', 
        'lm_avg', 'lm_avg-1', 'lm_avg-2', 'lm_avg-3', 'lm_avg-4', 'lm_avg-5', 
        'min_amt', 'min_amt-1', 'min_amt-2', 'min_amt-3', 'min_amt-4', 'min_amt-5'
    ]
)

核心改进

  • 强制排序:确保分组内数据按时间顺序排列,让iloc索引能正确定位目标数据。
  • 补全数据长度:对记录不足的分组补None,保证每个分组生成的列表长度一致,避免DataFrame构造时出现多行异常。
  • 修正列名:统一列名命名规范,避免后续数据引用错误。

内容的提问来源于stack exchange,提问作者Pravin Nadar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:25:32