如何用Python的pandas将单列存储的多选题转换为可读分析数据
单列存储的多选题拆分为多列的Pandas实现方案
最简原生实现(无需提前拆分列表)
Pandas内置的str.get_dummies方法原生支持指定分隔符拆分多选项列并生成哑变量列,比手动写判断逻辑效率更高,代码如下:
import pandas as pd # 1. 对多选题列直接生成哑变量,指定分隔符为换行符 dummies = df.iloc[:, 1].str.get_dummies(sep='\n').astype(bool) # 2. 补全所有可选选项,避免样本中未出现的选项缺失 all_options = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] for opt in all_options: if opt not in dummies.columns: dummies[opt] = False # 按预设顺序重排列 dummies = dummies[all_options] # 3. 与原表拼接得到最终结果 result = pd.concat([df, dummies], axis=1)
如果后续需要做数值计算,不需要布尔值的话,去掉.astype(bool)即可,方法默认输出0/1的整型值。
已拆分为列表后的处理方案
如果你已经提前执行了df.iloc[:,1].str.split('\n')将列转为列表格式,可以用explode+透视的方式处理:
# 将列表列拆分为多行 df_exploded = df.explode(df.columns[1]) # 新增标记列用于透视 df_exploded['mark'] = True # 透视回宽表,缺失值填充为False pivot_df = df_exploded.pivot( index=['ID', df.columns[1]], columns=df.columns[1], values='mark' ).fillna(False).reset_index().rename_axis(columns=None) # 同上补全未出现的选项列即可 all_options = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] for opt in all_options: if opt not in pivot_df.columns: pivot_df[opt] = False pivot_df = pivot_df[['ID', df.columns[1]] + all_options]
两种方案的输出结果完全一致,前者代码更简洁适合纯转换需求,后者可以得到拆分后的中间长表,适合做选项频次统计类的额外分析。
内容的提问来源于stack exchange,提问作者user15368200
相关产品推荐
相关产品推荐

