如何找出3个DataFrame中出现2次及以上的'num'值并标记次数?
解决方法:用合并统计替代内连接,覆盖「至少2个DataFrame出现」的场景
嘿,我完全懂你的困扰——内连接确实只能揪出三个DataFrame都共有的num,没法覆盖仅在两个里出现的情况。其实换个思路,咱们先把所有数据整合起来,统计每个num在多少个不同的DataFrame里出现,再筛选符合条件的就行,这才是最高效的方案。
方法一:Pandas 合并+分组统计(推荐,适配大数据量)
这个方法能准确统计每个num跨DataFrame的出现次数,还能避免同一个DataFrame内重复num的干扰:
import pandas as pd # 给每个DataFrame标记来源(方便后续统计不同来源的数量) df1['from_df'] = 'df1' df2['from_df'] = 'df2' df3['from_df'] = 'df3' # 合并三个DataFrame的`num`和来源列 combined_df = pd.concat([df1[['num', 'from_df']], df2[['num', 'from_df']], df3[['num', 'from_df']]]) # 按`num`分组,统计每个num在多少个不同的DataFrame里出现(去重统计来源) num_counts = combined_df.groupby('num')['from_df'].nunique() # 筛选出至少在2个DataFrame中出现的num,整理成最终结果 final_result = num_counts[num_counts >= 2].reset_index() final_result.columns = ['num', 'occurrence_count']
为什么这个方法好用?
- 不管单个DataFrame里的
num重复多少次,都只会按「不同DataFrame」计数,结果更准确 - 效率高,处理十万级以上的数据也不会卡顿
- 扩展性强:后续再加DataFrame,只需要重复添加来源标记、合并两步就行
方法二:集合运算(适合小数据量,逻辑直观)
如果你的数据量不大,用集合的交集/并集运算会更直观:
# 先提取每个DataFrame的唯一num集合 set_df1 = set(df1['num'].unique()) set_df2 = set(df2['num'].unique()) set_df3 = set(df3['num'].unique()) # 找出至少在两个集合里出现的num:两两交集的并集 target_nums = (set_df1 & set_df2) | (set_df1 & set_df3) | (set_df2 & set_df3) # 统计每个num的出现次数 final_result = pd.DataFrame([ {'num': num, 'occurrence_count': sum(1 for s in [set_df1, set_df2, set_df3] if num in s)} for num in target_nums ])
为什么内连接不行?
内连接(pd.merge多次)本质是取三个DataFrame的交集,只有同时存在于三个df里的num才会被保留,自然会漏掉仅在两个df里出现的情况。而我们需要的是「两两交集的并集」,刚好是上面两种方法能覆盖的范围。
内容的提问来源于stack exchange,提问作者Hana
相关产品推荐
相关产品推荐

