Python中重复合并Pandas DataFrame时第三次合并后大量数据丢失问题排查
问题分析与解决方案
让我来帮你拆解下这个数据丢失的问题——核心原因其实是你用的pd.merge()默认是内连接(Inner Join),这会悄悄过滤掉那些没有匹配子节点的行,导致每次合并后数据量越来越少,第三次大量丢失就是因为大部分child_3已经没有后续子节点了。
一、先修复合并逻辑:改用左连接
你的merge_dataset函数里,默认的内连接只会保留左右表在连接键上完全匹配的行。如果某个child_n没有对应的子节点(也就是不在parent_child_longlist的RID列里),这些行就会被直接丢掉。
把函数改成左连接(how='left'),就能保留左表的所有行,没有匹配的子节点用NaN填充,不会丢失数据:
def merge_dataset(df1, list_df, index_1, index_2): num_df = pd.DataFrame(list_df, columns=[index_1, index_2]) # 关键:用左连接替代默认的内连接 df2 = pd.merge(df1, num_df, on=index_1, how='left') return df2
这样再执行第二次、第三次合并时,即使child_2/child_3没有子节点,原来的行都会保留,只是新列会显示NaN,不会出现数据丢失的情况。
二、优化流程:自动循环合并直到无新节点
手动调用10-20次太繁琐了,我们可以写一个循环函数,自动迭代合并,直到没有新的子节点可添加为止:
def recursive_merge(base_df, parent_child_list, start_child_col='child_1'): current_df = base_df.copy() current_col = start_child_col while True: # 生成下一个子节点列名,比如child_1→child_2 next_col_num = int(current_col.split("_")[-1]) + 1 next_col = f'child_{next_col_num}' # 左连接合并 merged_df = pd.merge( current_df, pd.DataFrame(parent_child_list, columns=[current_col, next_col]), on=current_col, how='left' ) # 检查新列是否全为空,如果是,说明没有更多子节点了,停止循环 if merged_df[next_col].isna().all(): break current_df = merged_df current_col = next_col return current_df # 调用示例:传入你的初始df和父子关系列表 final_result = recursive_merge(df, parent_child_longlist, start_child_col='child_1')
这个函数会自动帮你生成child_1到child_n的所有列,直到所有可能的父子关联都被映射完成,不用再手动一次次调用合并函数。
三、额外排查点
- 确认
parent_child_longlist里的父子关系没有格式问题:比如RID和Child_RID的大小写、空格、拼写错误,这些都会导致匹配失败,间接造成数据丢失。 - 如果你的父子关系是从第一个DataFrame(RID-Child_RID表)来的,建议直接转成列表,避免重复构造:
# 假设第一个父子关联表叫parent_child_df parent_child_longlist = parent_child_df[['RID', 'Child_RID']].values.tolist()
内容的提问来源于stack exchange,提问作者MNM
相关产品推荐
相关产品推荐

