使用Pandas将含多字符串的列拆分为多行(Google Sheets数据处理)
解决Pandas将多值列拆分为多行的问题
需求说明
需要将DataFrame中Class列里的多个字符串拆分,每个字符串单独占一行,其他列的内容对应保留。
初始DataFrame代码:
import pandas as pd df = pd.DataFrame({'Name': ['Bob', 'John', 'Ric'], 'Submitted At': ['2022/08/12 23:56:42', '2022/08/12 23:56:42', '2022/08/12 23:56:42'], 'Class': ['Math,English,History', 'English,History', 'Math, Chemistry']}) print(df)
初始输出:
Name Submitted At Class 0 Bob 2022/08/12 23:56:42 Math,English,History 1 John 2022/08/12 23:56:42 English,History 2 Ric 2022/08/12 23:56:42 Math, Chemistry
错误代码分析
你尝试的代码报错是因为melt的var_name参数需要传入字符串,而你传入了DataFrame切片df2.iloc[:, 2:6],参数类型不匹配,触发ValueError。
正确解法
方法1:使用explode(Pandas 0.25+支持,最简洁)
先将Class列按逗号拆分并转为列表,再用explode将列表元素拆分为多行:
# 拆分Class列为列表,处理带空格的分隔情况 df['Class'] = df['Class'].str.split(',\s*') # 将列表元素拆分为多行 result = df.explode('Class').reset_index(drop=True) print(result)
输出结果:
Name Submitted At Class 0 Bob 2022/08/12 23:56:42 Math 1 Bob 2022/08/12 23:56:42 English 2 Bob 2022/08/12 23:56:42 History 3 John 2022/08/12 23:56:42 English 4 John 2022/08/12 23:56:42 History 5 Ric 2022/08/12 23:56:42 Math 6 Ric 2022/08/12 23:56:42 Chemistry
方法2:使用split+stack(兼容旧版本Pandas)
如果你的Pandas版本较低,不支持explode,可以用以下方法:
# 拆分Class列并展开为多列 split_df = df['Class'].str.split(',\s*', expand=True) # 合并原数据并将多列转为行 result = df.drop('Class', axis=1).join(split_df).melt(id_vars=['Name', 'Submitted At'], value_name='Class') # 过滤空值并排序重置索引 result = result.dropna(subset=['Class']).sort_values('Name').reset_index(drop=True) print(result)
输出和方法1一致。
关键说明
- 使用
,\s*作为分隔符,是为了处理像Math, Chemistry这种带空格的分隔情况,避免拆分后Class值带前导空格。 explode方法直接将列表类型的列拆分为多行,是最直观高效的方式。
内容的提问来源于stack exchange,提问作者Kardu
相关产品推荐
相关产品推荐

