You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:55:01