如何清洗含多选子列的Navigraph调查CSV数据并生成tidy格式?
步骤1:数据导入与初始预处理
先解压数据文件,用pandas读取时跳过前两行(第三行起为受访者数据),注意表头包含多选子列的命名(比如Q1_OptionA、Q1_OptionB这类格式):
import pandas as pd # 读取数据,跳过前2行,第一行作为表头 df = pd.read_csv("flightsim-community-survey-by-navigraph-2022-data.csv", skiprows=2)
步骤2:用melt()转换宽表为长表
使用melt()将所有列转为行,生成包含“原列名”和“回答内容”的临时表:
# 转换为长表,var_name存储原列名(问题标识),value_name存储回答 melted_df = df.melt(id_vars=[], var_name="问题标识", value_name="回答")
步骤3:处理多选子列,提取统一问题名
针对带后缀的多选子列(如Q2_使用MSFS、Q2_使用X-Plane),通过字符串提取获取统一的问题名称,同时过滤无效回答:
# 从问题标识中提取问题主体(去掉_后的选项后缀) melted_df["问题"] = melted_df["问题标识"].str.extract(r"(Q\d+.*?)(?=_|$)") # 过滤无有效回答的行(根据数据实际调整,比如去掉空值或"未选择"类值) cleaned_df = melted_df[melted_df["回答"].notna() & (melted_df["回答"] != "")] # 最终保留问题和回答两列 final_df = cleaned_df[["问题", "回答"]].reset_index(drop=True)
补充说明
- 单选列(无选项后缀)会直接保留原列名作为问题名,不影响结果。
- 若多选列用布尔值/特定编码标记选中状态(比如1代表选中),需调整过滤条件为
melted_df["回答"] == 1。
内容的提问来源于stack exchange,提问作者tmn
相关产品推荐
相关产品推荐

