如何使用pandas计算两个DataFrame匹配类别的浏览量占比
实现方案
直接通过isin结合列去重操作即可完成,全程不需要做表连接,代码简洁高效:
import pandas as pd # 示例数据集 TableA = pd.DataFrame({'c': ['A', 'A', 'B', 'C', 'C'], 'views': [10, 10, 20, 25, 25] }) TableB = pd.DataFrame({'c': ['A', 'A', 'B', 'B']}) # 计算占比 target_c = TableB['c'].unique() a_unique = TableA.drop_duplicates('c', keep='first') ratio = a_unique[a_unique['c'].isin(target_c)]['views'].sum() / a_unique['views'].sum() print(ratio) # 输出 0.5454545454545454,即30/55
逻辑说明
- 仅对TableB的
c字段提取唯一值,不需要对整个TableB做全表去重,开销极低 - 仅对TableA按
c字段做一次去重,得到每个类别对应的唯一浏览量 - 通过
isin过滤出属于TableB覆盖的类别,直接求和后除以总去重浏览量得到结果
如果你的TableA中同一类别对应的views一定是相同的,也可以用groupby替代去重操作,写法如下:
a_agg = TableA.groupby('c')['views'].first() ratio = a_agg[a_agg.index.isin(TableB['c'].unique())].sum() / a_agg.sum()
两种方案都不需要做表连接,性能远高于反连接实现。
内容的提问来源于stack exchange,提问作者vojta
相关产品推荐
相关产品推荐

