多DataFrame重叠行提取:基于最小出现次数的过滤实现
多Pandas DataFrame提取指定次数重叠行的方法
不用一次次两两merge,直接用「合并+分组统计」的思路高效解决,步骤如下:
先准备示例数据
假设你有df1到df5这几个DataFrame:
import pandas as pd df1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['x', 'y', 'z']}) df2 = pd.DataFrame({'A': [2, 3, 4], 'B': ['y', 'z', 'w']}) df3 = pd.DataFrame({'A': [3, 4, 5], 'B': ['z', 'w', 'v']}) df4 = pd.DataFrame({'A': [1, 3, 5], 'B': ['x', 'z', 'v']}) df5 = pd.DataFrame({'A': [2, 3, 6], 'B': ['y', 'z', 'u']})
具体实现步骤
1. 给每个DataFrame加来源标识
给每个df加一列标记它的来源,方便后续统计行在多少个df里出现:
df1['source'] = 'df1' df2['source'] = 'df2' df3['source'] = 'df3' df4['source'] = 'df4' df5['source'] = 'df5'
2. 合并所有DataFrame
把所有df纵向拼合成一个大表:
combined_df = pd.concat([df1, df2, df3, df4, df5], ignore_index=True)
3. 按行内容分组,统计出现的DataFrame数量
这里假设判断行重叠的依据是A和B列(如果是所有列都相同才算重叠,后面有补充方法),分组后统计每个组对应的不同来源数量:
# 按A、B列分组,统计每个组来自多少个不同的df count_df = combined_df.groupby(['A', 'B'])['source'].nunique().reset_index(name='df_count')
4. 筛选符合最小次数要求的行
比如你要提取至少在3个df中出现的行,直接过滤df_count >=3的记录:
min_required = 3 # 筛选出符合条件的行信息 filtered_rows = count_df[count_df['df_count'] >= min_required]
5. 获取最终结果(两种需求可选)
- 如果只需要去重后的唯一重叠行:
unique_overlap = filtered_rows[['A', 'B']].drop_duplicates() # 输出结果: # A B # 1 2 y # 2 3 z
- 如果需要保留所有来源的完整记录(比如看这些重叠行分别来自哪些df):
final_result = combined_df.merge(filtered_rows[['A', 'B']], on=['A', 'B'], how='inner')
补充:按所有列判断重叠的情况
如果你的“重叠行”是指所有列内容都完全相同,只需要修改分组的列即可,自动排除source列:
# 获取除了source之外的所有列作为分组依据 group_cols = combined_df.columns.difference(['source']) count_df = combined_df.groupby(group_cols)['source'].nunique().reset_index(name='df_count')
这种方法比多次两两merge效率高得多,尤其是当DataFrame数量多的时候,逻辑也更清晰,不用反复处理中间合并结果。
内容的提问来源于stack exchange,提问作者honeymoon
相关产品推荐
相关产品推荐

