如何比对带重复值的Pandas DataFrame并生成计数准确的透视表
解决方案
核心问题说明
原方案按frame单字段执行外连接,同frame下两个表的多行数据会生成笛卡尔积(行数量=df1同frame行数×df2同frame行数),直接导致后续统计出现重复计数、结果失真。
优化实现步骤
步骤1:预构建df2的frame-label映射字典
将df2按frame分组,把每个frame对应的所有label存储为集合,后续判断存在性的时间复杂度为O(1):
# 生成frame到对应label集合的映射 df2_frame_label_map = df2.groupby('frame')['label'].agg(set).to_dict()
步骤2:直接为df1打匹配标记
无需合并表,直接基于每行的frame和label判断是否在df2同frame的label集合中,完全避免行膨胀:
df1['cross'] = df1.apply( lambda row: 'Matched' if row['label'] in df2_frame_label_map.get(row['frame'], set()) else 'Mismatched', axis=1 )
步骤3:生成统计透视表
直接用标记后的df1生成透视表,统计结果完全准确:
# 按唯一frame数量统计 pv_m_unq = pd.pivot_table( df1, columns='cross', index='label', values='frame', aggfunc=pd.Series.nunique, fill_value=0, margins=True ) # 按行数量统计 pv_mc = pd.pivot_table( df1, columns='cross', index='label', values='frame', aggfunc=pd.Series.count, fill_value=0, margins=True )
方案优势
- 完全消除行膨胀问题,处理后数据行数与原始df1完全一致,不会出现重复计数
- 计算效率更高,无需执行表合并操作,大数据量下性能优势显著
- 统计逻辑完全贴合需求,透视表合计值、单类别数值均不会出现错误
内容的提问来源于stack exchange,提问作者TeoK
相关产品推荐
相关产品推荐

