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

如何比对带重复值的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:06:02