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

Pandas按Division分组统计Question列(含空值)的各选项次数

按Division分组统计Question列各选项次数并转列的实现

直接用pandas的透视表或分组转宽表就能搞定,下面是具体步骤和代码:

核心思路

先把Question列的空值统一标记,再按Division分组统计各选项的出现次数,最后把统计结果转成需求的列格式,再计算总记录数。

示例代码

import pandas as pd
import numpy as np

# 模拟测试数据(实际替换成你的DataFrame即可)
df = pd.DataFrame({
    'Division': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'C'],
    'Question': ['Yes', 'No', np.nan, 'Yes', np.nan, 'No', 'No', 'Yes', np.nan]
})

# 1. 将空值替换为'Null',方便统一统计
df['Question'] = df['Question'].fillna('Null')

# 2. 按Division分组,统计各Question选项的数量并转成宽表
# fill_value=0表示无对应记录的计数填0,要显示NaN则删除该参数
stats_df = df.pivot_table(
    index='Division',
    columns='Question',
    aggfunc='size',
    fill_value=0
)

# 3. 重命名列名到需求格式
stats_df.rename(
    columns={'Null': 'Null_Counts', 'Yes': 'Yes_Counts', 'No': 'No_Counts'},
    inplace=True
)

# 4. 新增Total列,计算每个Division的总记录数
stats_df['Total'] = stats_df.sum(axis=1)

# 可选:将Division从索引转为普通列
stats_df = stats_df.reset_index()

print(stats_df)

运行结果

Division  Null_Counts  Yes_Counts  No_Counts  Total
0        A            1           1          1      3
1        B            1           1          0      2
2        C            1           1          2      4

另一种写法(groupby+unstack)

如果更习惯用groupby语法,也可以这么实现:

df['Question'] = df['Question'].fillna('Null')
stats_df = df.groupby('Division')['Question'].value_counts().unstack(fill_value=0)
stats_df = stats_df.rename(columns={'Null':'Null_Counts', 'Yes':'Yes_Counts', 'No':'No_Counts'})
stats_df['Total'] = stats_df.sum(axis=1)
stats_df = stats_df.reset_index()

若需要空计数显示为NaN而非0,只需去掉代码中的fill_value=0参数即可。

内容的提问来源于stack exchange,提问作者Dr. Spock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:16:00