按Variable分组统计两个DataFrame中ID列的差异数量需求
按分组统计两个DataFrame中ID列的独有元素数量
我有两个各约15万行的DataFrame,示例数据如下:
df1的前几行:
Variable ID A ENSG00000185352 A ENSG00000136267 A ENSG00000141668 B ENSG00000154975 B ENSG00000169855 B ENSG00000173406
df2的前几行:
Variable ID A ENSG00000999999 A ENSG00000136267 A ENSG00000141668 B ENSG00000111588 B ENSG00000000000 B ENSG00000173987
需求是按相同的Variable分组,统计每组中df1的ID列里不在df2对应组中的元素数量,预期输出如下:
Comparison Number of differences A 1 B 3
解决方案
针对大数量级数据(15万行),采用分组+集合操作的方式保证效率:
import pandas as pd # 对两个DataFrame按Variable分组,提取每组的ID集合 grouped_df1 = df1.groupby('Variable')['ID'].apply(set) grouped_df2 = df2.groupby('Variable')['ID'].apply(set) # 计算每组中df1独有的ID数量 result = pd.DataFrame({ 'Comparison': grouped_df1.index, 'Number of differences': grouped_df1.apply(lambda x: len(x - grouped_df2[x.name])) }).reset_index(drop=True) print(result)
补充说明
- 用
groupby('Variable')['ID'].apply(set)将每组ID转为集合,集合的差集操作能快速筛选出独有元素,比逐行匹配效率更高 - 如果存在某
Variable只在其中一个DataFrame中出现的情况,可以用外连接兼容该场景:
# 合并分组结果,空组填充空集合 merged_groups = grouped_df1.to_frame('set1').join(grouped_df2.to_frame('set2'), how='outer').fillna({'set1': set(), 'set2': set()}) # 计算df1独有ID数量 merged_groups['Number of differences'] = merged_groups.apply(lambda row: len(row['set1'] - row['set2']), axis=1) # 整理成预期格式 result = merged_groups.reset_index().rename(columns={'Variable': 'Comparison'})[['Comparison', 'Number of differences']]
运行上述代码后,即可得到符合预期的统计结果。
内容的提问来源于stack exchange,提问作者Workhorse
相关产品推荐
相关产品推荐

