数据集转换:拆分DataFrame的Tag列并实现每行单一标签
解决方法:拆分DataFrame的Tag列并展开为多行
嘿,这个需求用pandas其实很容易实现,我给你一步步讲清楚:
首先,先假设我们有一个类似这样的示例DataFrame:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'ID': [1, 2], 'Name': ['Alice', 'Bob'], 'Tag': ['Python/Data Science/Pandas', 'Java/Spring Boot'] })
方法一:使用str.split() + explode()(推荐,pandas 0.25+可用)
这是最简洁的方式,先把Tag列按/拆分成列表,再用explode()方法把列表中的每个元素拆成单独的行,其他列的内容会自动复制:
# 拆分Tag列为列表,然后展开为多行 df_expanded = df.assign(Tag=df['Tag'].str.split('/')).explode('Tag') # 如果需要重置索引(避免原索引重复),可以加上ignore_index=True df_expanded = df.assign(Tag=df['Tag'].str.split('/')).explode('Tag', ignore_index=True)
处理后的结果会是这样:
| ID | Name | Tag |
|---|---|---|
| 1 | Alice | Python |
| 1 | Alice | Data Science |
| 1 | Alice | Pandas |
| 2 | Bob | Java |
| 2 | Bob | Spring Boot |
方法二:兼容旧版pandas(低于0.25)的方案
如果你的pandas版本比较旧,没有explode()方法,可以用set_index() + stack()的组合来实现:
# 先设置其他列为索引,拆分Tag列后堆叠,最后重置索引 df_expanded = df.set_index(['ID', 'Name'])['Tag'].str.split('/', expand=True).stack().reset_index(name='Tag').drop('level_2', axis=1)
额外注意点
- 如果
Tag列存在空值(比如NaN),explode()默认会保留这些空行,如果你想去掉空行,可以在处理后加上dropna(subset=['Tag']):df_expanded = df_expanded.dropna(subset=['Tag']) - 确保
Tag列的内容都是字符串类型,如果有非字符串值,先转成字符串再拆分:df['Tag'] = df['Tag'].astype(str)
内容的提问来源于stack exchange,提问作者NBC
相关产品推荐
相关产品推荐

