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

Pandas中分组统计后转置DataFrame导致count()结果异常的修复方案咨询

解决df1分组统计type出现次数并合并到df2的问题

你的问题根源在于混淆了groupby后的count()和size()方法:count()会逐列统计非空值的数量,而你实际需要的是每个type分组的总行数,不管某列是否有NULL值。

修复步骤详解:

  1. 正确统计每个type的出现次数
    用size()替代count(),它直接返回每个分组的总行数,完美适配你的需求:

    # 统计每个type的总行数,返回Series
    type_counts = df1.groupby('type').size()
    # 转换为DataFrame并重置索引,方便后续处理
    type_counts_df = type_counts.reset_index(name='total_count')
    

    这一步会得到:

    typetotal_count
    A2
    B1
  2. 转换为你需要的宽表格式(count_A、count_B)
    用pivot把长表转成宽表,并用fillna(0)处理可能缺失的type(如果后续有新type也能兼容):

    # 转宽表,填充缺失值为0并转为整数
    type_pivot = type_counts_df.pivot(columns='type', values='total_count').fillna(0).astype(int)
    # 添加前缀,生成count_A、count_B列名
    type_pivot = type_pivot.add_prefix('count_')
    # 重置索引,确保和df2的索引对齐
    type_pivot = type_pivot.reset_index(drop=True)
    
  3. 合并到df2
    因为df2和统计结果都是单一行,直接用pd.concat按列合并即可:

    import pandas as pd
    # 合并两个DataFrame
    final_df = pd.concat([df2, type_pivot], axis=1)
    

最终结果

运行后你会得到期望的格式:

namevaluecount_Acount_B
Name12321

为什么原来的代码出错?

你之前用groupby('type').count()时,它会对每一列单独统计非空值:

  • 对于fake_id列,type B的行是NULL,所以count为0
  • 对于date列,type B的行有值,count为1
    而size()不关心列是否为空,只统计分组内的总行数,这才是你需要的“出现次数”。

内容的提问来源于stack exchange,提问作者Jnl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:37:31