Python数据转换与EDA问题:单txn_id出现多行结果排查
问题解决:单个txn_id对应多行的pandas数据处理修正
问题根源
- 分组内数据未按时间排序:如果原始数据没有按时间顺序排列,
iloc[-1]和iloc[-6:-1]无法精准获取最新值及目标历史数据,逻辑上会出现偏差。 - 未处理数据量不足的分组:若某个
txn_id的记录数少于6条,iloc[-6:-1]返回的序列长度不足5,导致生成的列表长度不一致,最终引发DataFrame构造异常或非预期多行。 - 列名笔误:代码中列名
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
相关产品推荐
相关产品推荐

