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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:06:14