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

如何从Lime Survey API获取的DataFrame中筛选指定问题列

处理LimeSurvey导出数据的子问题统计

我来帮你搞定这个事儿!从LimeSurvey通过Remote Control API拿到的数据经常会有这种格式问题,不过用Pandas就能轻松拆分和统计。先分几种常见的情况给你说解决方案:

情况1:宽格式数据(每个问题是一列,每行是一位受访者的回答)

如果你的DataFrame是这种结构——列名是q10[wor1]、q10[wor2]...q10[wor7],每行对应一个受访者的所有回答,那可以用正则筛选列来统计:

单个子问题筛选&计算

import pandas as pd

# 筛选q10下的wor1问题列
wor1_data = df.filter(regex=r'q10\[wor1\]')
# 计算该问题的平均值(axis=0表示按列计算,即所有受访者的均值)
wor1_average = wor1_data.mean(axis=0).values[0]

批量处理所有wor1到wor7

如果要一次性统计所有子问题,用循环更高效:

# 生成子问题列表
sub_questions = [f'wor{i}' for i in range(1, 8)]
average_results = {}

for sub_q in sub_questions:
    # 匹配对应子问题的列
    target_cols = df.filter(regex=r'q10\[{}\]'.format(sub_q))
    # 计算均值并存入字典
    average_results[sub_q] = target_cols.mean(axis=0).values[0]

# 转成DataFrame方便查看结果
avg_df = pd.DataFrame.from_dict(average_results, orient='index', columns=['平均值'])
print(avg_df)

情况2:长格式数据(每行是一个问题的单个回答)

如果你的DataFrame是长格式——比如有question列(存q10[wor1]这类字符串)和response列(存回答数值),那先提取子问题标识再分组统计:

# 从question列提取括号里的子问题名称
df['sub_question'] = df['question'].str.extract(r'\[(.*?)\]')
# 提取主问题类别(比如q10)
df['main_question'] = df['question'].str.extract(r'(q\d+)\[')

# 筛选q10类别的所有数据
q10_data = df[df['main_question'] == 'q10']
# 按子问题分组计算平均值
q10_sub_avg = q10_data.groupby('sub_question')['response'].mean()
print(q10_sub_avg)

情况3:单列字符串格式(每行是类似q10[wor1]: 4的内容)

如果你的数据是单列,每个元素是问题加回答的字符串,那先拆分出问题和数值:

# 拆分单列数据为问题和值两列
df[['question', 'value']] = df['single_column'].str.split(': ', expand=True)
# 将value转为数值类型
df['value'] = pd.to_numeric(df['value'])

# 接下来就可以用情况2的方法提取子问题并统计了
df['sub_question'] = df['question'].str.extract(r'\[(.*?)\]')
q10_avg = df[df['question'].str.startswith('q10')].groupby('sub_question')['value'].mean()

这样不管你的数据是哪种格式,都能轻松筛选出每个子问题的数据并计算平均值啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:15:07