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

