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
相关产品推荐
相关产品推荐

