如何基于Pandas DataFrame统计各问题的回答占比?
统计Pandas DataFrame中各问题的选项占比
首先还原你提供的DataFrame:
import pandas as pd # 构造示例数据 data = { "Do you smoke?": ["yes", "no", "sometimes", "no", "no", "yes"], "Do you exercise?": ["no", "yes", "yes", "yes", "no", "no"], "Do you sleep less than 8 hours?": ["sometimes", "no", "yes", "sometimes", "no", "yes"] } df = pd.DataFrame(data)
方法一:直接生成宽格式占比表
对DataFrame的每一列使用value_counts(normalize=True),直接得到该列各选项的占比,再转成百分比格式:
# 计算每列各选项的占比,转成百分比并保留两位小数 percentage_result = df.apply( lambda col: col.value_counts(normalize=True).mul(100).round(2) ) print(percentage_result)
运行后输出结果:
Do you smoke? Do you exercise? Do you sleep less than 8 hours? no 50.0 33.33 33.33 yes 33.33 66.67 33.33 sometimes 16.67 0.00 33.33
方法二:生成规整的长格式占比表
如果需要更适合后续分析或可视化的长表格式(问题、选项、占比三列),可以先将数据转成长格式,再分组计算:
# 将宽表转成长表,提取问题和对应的回答 melted_df = df.melt(var_name="Question", value_name="Answer") # 按问题和回答分组,计算每组占该问题总人数的百分比 long_format_result = ( melted_df.groupby(["Question", "Answer"]) .size() .groupby(level=0) .apply(lambda x: x / x.sum() * 100) .round(2) .reset_index(name="Percentage") ) print(long_format_result)
运行后输出结果:
Question Answer Percentage 0 Do you exercise? no 33.33 1 Do you exercise? yes 66.67 2 Do you smoke? no 50.00 3 Do you smoke? sometimes 16.67 4 Do you smoke? yes 33.33 5 Do you sleep less than 8 hours? no 33.33 6 Do you sleep less than 8 hours? sometimes 33.33 7 Do you sleep less than 8 hours? yes 33.33
关键说明
value_counts(normalize=True):返回各选项在列中的占比(0-1之间的小数)mul(100):将小数占比转换为百分比round(2):保留两位小数,让结果更易读melt():将宽格式数据转换为长格式,方便按问题分组统计
内容的提问来源于stack exchange,提问作者JFCastello
相关产品推荐
相关产品推荐

