如何提取多个DataFrame的公共行并生成新DataFrame
多DataFrame提取全量共有行实现方案
要获取多个输入DataFrame共有的完整行,有两种经过验证的可行实现,根据你的数据规模选择即可:
方法1:链式内连接(适配性最强,推荐日常使用)
pandas的内连接逻辑默认只保留所有关联表中匹配键完全一致的行,只要把所有列设为匹配键,做链式内连接就能直接得到所有表的共有行,对数据类型没有特殊要求。
import pandas as pd from functools import reduce # 所有待处理的DataFrame统一放入列表 df_list = [df1, df2, df3] # 按你实际的变量名替换、增减 # 链式做内连接,默认按所有同名列匹配 common_df = reduce(lambda left, right: pd.merge(left, right, how="inner"), df_list)
如果只需要按指定列判断行是否共有(比如仅按ID列匹配),给merge加on=["列名1", "列名2"]参数指定匹配字段即可。
方法2:行值交集计算(大表性能更优)
如果单表数据量在十万级以上,链式merge的性能会下降,可以把每个DataFrame的行转成可哈希元组,直接取集合交集,再转换回DataFrame,速度会快很多:
from functools import reduce df_list = [df1, df2, df3] # 把每个DataFrame的行转成元组集合 row_set_list = [set(df.itertuples(index=False, name=None)) for df in df_list] # 计算所有行集合的交集 common_rows = list(reduce(lambda x, y: x & y, row_set_list)) # 转换回和原表列结构一致的DataFrame common_df = pd.DataFrame(common_rows, columns=df_list[0].columns)
注意:这个方法要求所有行的字段值都是可哈希类型(数值、字符串、时间戳都支持,列表、字典等可变类型不支持),如果有不可哈希字段请用方法1。
两种方法输出的结果完全一致,都是仅保留在所有输入DataFrame中完整存在的行,和你预期的输出效果匹配。
内容的提问来源于stack exchange,提问作者eleni.ps
相关产品推荐
相关产品推荐

