n个DataFrame基于指定列的行交集筛选合并需求问询
嘿,这个需求我熟!咱们要做的就是基于指定列(Column C)取多个DataFrame的行交集——也就是只保留那些Column C的值在所有输入DF里都存在的行,像19.0、26.0、27.50这种只在部分DF里出现的值对应的行,直接过滤掉。我给你整理了清晰的实现思路和可复现代码,一看就懂!
实现步骤与代码
1. 先准备示例数据
假设我们有3个DataFrame,先创建模拟数据方便测试:
import pandas as pd # 创建3个示例DataFrame df1 = pd.DataFrame({ 'Column A': ['a1', 'a2', 'a3', 'a4'], 'Column B': ['b1', 'b2', 'b3', 'b4'], 'Column C': [10.0, 19.0, 25.0, 27.5] }) df2 = pd.DataFrame({ 'Column A': ['a5', 'a6', 'a7', 'a8'], 'Column B': ['b5', 'b6', 'b7', 'b8'], 'Column C': [10.0, 25.0, 26.0, 30.0] }) df3 = pd.DataFrame({ 'Column A': ['a9', 'a10', 'a11', 'a12'], 'Column B': ['b9', 'b10', 'b11', 'b12'], 'Column C': [10.0, 25.0, 30.0, 35.0] })
2. 找出所有DF中Column C的共同值
核心是先拿到在所有DataFrame的Column C里都出现的值集合,这样后续才能用这个集合去筛选行:
# 通用写法,不管n是多少都能用 dfs = [df1, df2, df3] # 先取第一个DF的Column C值作为初始集合 common_c_values = set(dfs[0]['Column C']) # 依次和剩下的DF的Column C取交集 for df in dfs[1:]: common_c_values.intersection_update(df['Column C'])
运行后common_c_values会是{10.0, 25.0}——这就是所有DF共有的Column C值。
3. 筛选并合并得到最终DataFrame
接下来用这个共同值集合,筛选每个DF中符合条件的行,最后合并成一个新的DF:
# 筛选每个DF中Column C在共同值里的行,然后合并 final_df = pd.concat([df[df['Column C'].isin(common_c_values)] for df in dfs], ignore_index=True)
这样得到的final_df里,就只有Column C为10.0和25.0的行,完全符合你的需求!
可选:按Column C对齐合并列
如果你需要的不是合并行,而是把各个DF中相同Column C值的列对齐合并(比如把相同C值的不同列数据放在一行),可以用内连接的方式:
# 按Column C做三次内连接,得到对齐后的结果 final_merged_df = df1.merge(df2, on='Column C', how='inner').merge(df3, on='Column C', how='inner')
这个结果会把三个DF的列按Column C合并,列名会自动加上后缀区分不同DF的列。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

