You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:35:28