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

如何在Pandas中转置调查问卷数据并统计响应分布?

解决Pandas问卷数据转李克特量表统计格式的问题

这里给你两种简单可行的方法,直接搞定格式转换:

方法一:用melt+交叉表(最简洁)

先把宽表转成每行对应一个问题+响应的长表,再用交叉表统计数量,还能保证李克特选项的顺序:

import pandas as pd

# 你的原始数据
df = pd.DataFrame({
    '姓名': ['John', 'Sally'],
    '问题1': ['同意', '不同意'],
    '问题2': ['不同意', '中立'],
    '问题3': ['中立', '同意']
})

# 定义李克特选项顺序(5级的话直接扩展成对应选项即可)
likert_options = ['不同意', '中立', '同意']

# 转长表
melted_df = df.melt(id_vars='姓名', var_name='问题', value_name='响应')
# 生成统计结果
result = pd.crosstab(melted_df['问题'], melted_df['响应'])[likert_options].reset_index()

print(result)

输出就是你要的目标格式,而且列顺序完全匹配李克特量表。

方法二:优化你之前的遍历+value_counts思路

你之前的方向是对的,只是没处理缺失选项补0和结果合并的问题,调整后如下:

import pandas as pd

df = pd.DataFrame({
    '姓名': ['John', 'Sally'],
    '问题1': ['同意', '不同意'],
    '问题2': ['不同意', '中立'],
    '问题3': ['中立', '同意']
})

likert_options = ['不同意', '中立', '同意']
stats_list = []

# 遍历所有问题列
for question_col in df.columns[1:]:  # 跳过姓名列
    # 统计每个选项数量,缺失的选项补0
    count = df[question_col].value_counts().reindex(likert_options, fill_value=0)
    stats_list.append(count)

# 合并统计结果并整理格式
result = pd.concat(stats_list, axis=1).T.reset_index()
result.columns = ['问题'] + likert_options

print(result)

两种方法都能得到你要的表格,要是用5级李克特,只需要把likert_options改成你对应的5个选项就行,比如['非常不同意', '不同意', '中立', '同意', '非常同意'],保证列顺序不会乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:12:55