如何用Python拆分Google Forms多选调查列并生成重复行?
拆分Google Forms导出CSV中的多选结果到多行
问题背景
我有一份Google Forms导出的CSV数据,其中Reasons列存储着用户的多选调查结果。导入后的DataFrame示例如下:
import pandas as pd filename = 'Example.csv' df = pd.read_csv(filename) print(df.to_dict("list"))
输出结果:
{ 'ID': [1, 2], 'Join Date': [ pd.Timestamp('2023-01-01 00:00:00'), pd.Timestamp('2022-12-01 00:00:00') ], 'Reasons': [ 'Benefits [Leave, Flexi, Dental, Insurance etc.], Compensation [Salary & Bonus]', 'Career & Growth Opportunities [Learning & Development, Progression], Meaningful work' ] }
需要将其转换为以下格式:每个用户选择的原因拆分为单独行,同时重复对应的ID和Join Date字段:
{ 'ID': [1, 1, 2, 2], 'Join Date': [ pd.Timestamp('2023-01-01 00:00:00'), pd.Timestamp('2023-01-01 00:00:00'), pd.Timestamp('2022-12-01 00:00:00'), pd.Timestamp('2022-12-01 00:00:00') ], 'Reasons': [ 'Benefits [Leave, Flexi, Dental, Insurance etc.]', 'Compensation [Salary & Bonus]', 'Career & Growth Opportunities [Learning & Development, Progression]', 'Meaningful work' ] }
由于Reasons选项内部包含逗号,无法直接按逗号拆分,请问如何用Python实现?explode()是否可行?
解决方案
explode()完全可行,但核心是先正确拆分Reasons列——要匹配那些不在方括号[]内的, 作为分隔符,这可以通过正则表达式实现。
具体步骤:
- 使用正则表达式拆分
Reasons列:匹配不在方括号中的,(正则逻辑:匹配逗号加空格,且该位置后面的内容中没有未闭合的方括号) - 对拆分后的列表列使用
explode(),将每个列表元素拆分为单独行,同时保留对应行的其他字段
代码实现:
import pandas as pd import re # 读取数据 df = pd.read_csv('Example.csv') # 定义正则:匹配不在[]内的", " split_pattern = re.compile(r', (?![^\[]*\])') # 拆分Reasons列为列表,然后explode df['Reasons'] = df['Reasons'].str.split(split_pattern) result_df = df.explode('Reasons').reset_index(drop=True) # 查看结果 print(result_df.to_dict("list"))
正则说明:
,:匹配逗号加空格的目标分隔符(?![^\[]*\]):负向预查规则,确保当前匹配的,不在任何一对未闭合的方括号内部,避免拆分选项里的内部逗号
输出验证:
运行上述代码后,得到的result_df就是目标格式:每个多选原因单独成行,ID和Join Date自动重复对应的值。
内容的提问来源于stack exchange,提问作者Marc12125
相关产品推荐
相关产品推荐

