Python/pandas中如何将元素归属多个分类并生成透视表
如何在Python/pandas中将元素划分到多个分类下
场景说明
现有input.csv数据包含两个字段:
- Song Name:歌曲名
- Genre:流派,单条记录存储对应歌曲所属的多个流派,示例数据如下:
| Song Name | Genre |
|---|---|
| 7 Rings | 'dance pop', 'pop', 'post-teen pop' |
| Run | 'dance pop', 'piano rock', 'pop', 'pop rock' |
| Dance Monkey | 'australian pop', 'pop' |
| All Of Me | 'neo soul', 'pop', 'pop soul', 'r&b', 'urban contemporary' |
需求说明
需要实现两类输出:
- 按流派分组,得到每个流派对应的所有歌曲列表,预期示例:
pop: ['7 Rings', 'Run', 'Dance Monkey', 'All Of Me'] dance pop : ['7 Rings','Run'] r&b: ['All Of Me']
- 生成新的DataFrame/CSV,每列对应一个流派,行存储对应流派下的歌曲,无匹配值则为空。
实现步骤
前置处理:转换字段类型
从CSV读取的Genre字段看起来是列表格式,实际为字符串类型,需要先转换为真实列表才能正常使用explode拆分:
import pandas as pd import ast # 读取原始数据 df = pd.read_csv('input.csv') # 将Genre字段的字符串格式列表转为真实列表 df['Genre'] = df['Genre'].apply(ast.literal_eval)
该写法比循环遍历更简洁,和原始遍历转换逻辑效果完全等价。
需求1:按流派聚合歌曲列表
# 拆分多流派后分组聚合 genre_song_map = df.explode('Genre').groupby('Genre')['Song Name'].agg(list).to_dict() # 打印结果验证 for genre, songs in genre_song_map.items(): print(f"{genre}: {songs}")
需求2:生成流派为列的宽表
genre_explode = df.explode('Genre')\ .assign(index=lambda d: d.groupby('Genre').cumcount())\ .pivot(index='index', columns='Genre', values='Song Name')\ .fillna('') # 导出为CSV genre_explode.to_csv('genre_song_table.csv', index=False) # 查看前几行结果 genre_explode.head()
内容的提问来源于stack exchange,提问作者RiBoFen
相关产品推荐
相关产品推荐

