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

Python/pandas中如何将元素归属多个分类并生成透视表

如何在Python/pandas中将元素划分到多个分类下

场景说明

现有input.csv数据包含两个字段:

  • Song Name:歌曲名
  • Genre:流派,单条记录存储对应歌曲所属的多个流派,示例数据如下:
Song NameGenre
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'

需求说明

需要实现两类输出:

  1. 按流派分组,得到每个流派对应的所有歌曲列表,预期示例:
pop: ['7 Rings', 'Run', 'Dance Monkey', 'All Of Me']
dance pop : ['7 Rings','Run']
r&b: ['All Of Me']
  1. 生成新的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:57:01