Python处理CSV问卷结果 按唯一问题分组输出对应答案
核心实现思路
实现该需求的核心是以问题ID作为唯一分组依据,不要直接按问题文本分组——示例中美食类问题的文本存在拼写误差(favoirte为笔误),如果直接按文本去重会将同一问题拆分为多个分组,这也是多数人编写逻辑时容易踩的坑。
整体实现仅需3步:
- 逐行读取CSV内容,将每行拆分为问题ID、问题文本、回答内容三个字段
- 以字典结构存储分组数据:键为问题ID,值存储两个信息:对应展示用的问题文本、归属该问题的所有回答列表
- 遍历分组结果,先输出问题文本,再逐行输出对应回答,按要求保留空行对齐格式即可。
方案1:使用Python内置csv模块实现
该方案无需安装第三方依赖,适合中小体量的问卷文件,Python3.7+版本的字典默认保留插入顺序,输出顺序和问题在CSV中第一次出现的顺序完全一致:
import csv from collections import defaultdict # 初始化分组容器 question_groups = defaultdict(lambda: {"show_text": "", "answers": []}) with open("你的问卷文件路径.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) for row in reader: # 跳过CSV中自带的空行 if not row: continue q_id = row[0].strip() q_text = row[1].strip() answer = row[2].strip() # 第一次读取到该问题ID时,记录展示用的问题文本 if not question_groups[q_id]["show_text"]: # 如需修正文本笔误,可在这里针对指定q_id手动赋值文本,比如q_id=="24"时强制赋值为正确的问题文本 question_groups[q_id]["show_text"] = q_text # 将回答追加到对应问题的回答列表中 question_groups[q_id]["answers"].append(answer) # 按要求格式打印输出 for group in question_groups.values(): print(group["show_text"]) print() for ans in group["answers"]: print(ans) print()
方案2:使用pandas实现
如果问卷数据体量较大(十万行级以上),用pandas做分组聚合的效率更高:
import pandas as pd # 读取CSV,手动指定列名,跳过空行 df = pd.read_csv( "你的问卷文件路径.csv", header=None, names=["q_id", "q_text", "answer"], skip_blank_lines=True, encoding="utf-8" ) # 按问题ID分组,同ID下取第一条出现的文本作为展示文本,聚合所有回答 grouped_result = df.groupby("q_id", as_index=False).agg( show_text=("q_text", "first"), answer_list=("answer", list) ) # 按格式输出 for _, row in grouped_result.iterrows(): print(row["show_text"]) print() for ans in row["answer_list"]: print(ans) print()
注意事项
- 不要用问题文本作为分组键:实际导出的问卷CSV经常存在同题文本多打空格、拼写错误、特殊字符不一致的问题,问题ID是系统生成的唯一标识,用ID分组不会出现同题被拆分的问题。
- 如果需要自定义问题输出顺序,可以额外维护一个问题ID的顺序列表,遍历的时候按列表顺序取对应分组即可。
- 读取CSV时注意指定和文件匹配的编码格式,避免出现中文乱码。
内容的提问来源于stack exchange,提问作者Parker Johnson
相关产品推荐
相关产品推荐

