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

按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)

补充说明

  1. 用groupby('Variable')['ID'].apply(set)将每组ID转为集合,集合的差集操作能快速筛选出独有元素,比逐行匹配效率更高
  2. 如果存在某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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:51:03