基于accident_no合并7个含重复值的DataFrame时行数超限的问题咨询
嘿,我来帮你理清楚这个问题~
结论先行:合并后行数超过400完全可能是正常情况,但具体是否符合你的需求,要看你想要的最终数据粒度是什么。
为什么会出现行数超过400的情况?
你的核心问题在于:部分表(比如Person)的accident_no是重复的(对应多人涉事场景),而合并操作的逻辑会直接影响最终行数:
1. 你的两种合并方法的逻辑分析
方法一(reduce + left merge):
当用left merge时,如果右侧表存在重复的accident_no,会触发笛卡尔积匹配。比如某事故在Person表中有3条记录,那么合并后该事故对应的行会从1条变成3条。如果后续再合并其他也有重复accident_no的表(比如Vehicle表,同一事故多辆车),行数会进一步膨胀——比如某事故在Person有3条、Vehicle有2条,合并后会变成3×2=6条记录,最终总行数自然会超过400。方法二(concat + 按索引对齐):
这种方式是按accident_no索引横向拼接,只要任意一张表存在重复索引(比如Person的400行),拼接后会保留所有重复索引行;如果其他表也有重复索引,或者存在其他表独有的accident_no,最终行数会进一步增加(比如表3有4个独有的accident_no,会额外新增4行)。
2. 两种常见需求对应的处理方式
你需要先明确自己的分析目标:
需求A:保留人员/车辆等明细(每条记录对应一个涉事人/车)
这种情况下,行数超过400是完全正常且符合预期的——因为合并操作就是把事故的基础信息和每条明细关联起来,最终行数等于所有明细记录的总和(甚至因为多表重复匹配的笛卡尔积会更多)。这种场景下你的操作没有错误,只是要确认这是你需要的分析粒度。需求B:只保留事故级别的汇总数据(每条记录对应一个唯一事故)
这种情况下,你需要先对有重复accident_no的表做聚合处理,再和其他表合并。比如对Person表统计每个事故的涉事人数、人员类型分布:# 对Person表做聚合 df_person_agg = df4.groupby('ACCIDENT_NO').agg( total_people=('PERSON_ID', 'count'), injured_count=('INJURY_STATUS', lambda x: sum(x == '受伤')) # 按需添加其他聚合字段 ).reset_index() # 再用聚合后的表和其他表合并 dfs = [df1, df2, df3, df_person_agg, df5, df6, df7] df_final = reduce(lambda left, right: pd.merge(left, right, on='ACCIDENT_NO', how='left'), dfs)这样合并后的行数会和Accident表的200条唯一事故记录接近(或保留left join逻辑下的所有行)。
内容的提问来源于stack exchange,提问作者Chaudhary Zamurad

