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

如何基于另一分类列添加分类列?代码为何全分配Techno?

为什么所有流派的genre_cat列都被赋值为'Techno'?

我希望为genre(流派)分配对应的音乐风格,创建了若干数组定义各流派所属类别,但运行代码后所有流派的genre_cat列都被赋值为'Techno',不符合预期:

Rap = ['Dark Trap', 'Hiphop', 'Rap', 'Underground Rap', 'RnB', 'trap', 'Trap Metal']
Techno = ['dnb', 'hardstyle', 'psytrance', 'techhouse', 'techno', 'trance']
Pop = ['pop']

for r in df['genre']:
    if r in Rap:
        df['genre_cat'] = 'Rap'
    elif r in Techno:
        df['genre_cat'] = 'Techno'
    else:
        df['genre_cat'] = 'Pop'
        
df[['genre', 'genre_cat']]

问题原因

你的循环逻辑存在错误:每次遍历df['genre']的元素时,都是对整个df['genre_cat']列进行赋值,而非仅给当前行的genre_cat字段赋值。

比如循环过程中,前几行如果匹配Rap,会把整列改成'Rap',但只要后续有一行匹配Techno,整列又会被覆盖成'Techno';如果最后一行的genre属于Techno列表,最终整列都会是'Techno',之前的所有赋值都会被冲掉。


正确解决方法

方法1:使用apply逐行处理

定义一个分类函数,用apply对genre列的每个元素单独处理:

Rap = ['Dark Trap', 'Hiphop', 'Rap', 'Underground Rap', 'RnB', 'trap', 'Trap Metal']
Techno = ['dnb', 'hardstyle', 'psytrance', 'techhouse', 'techno', 'trance']
Pop = ['pop']

def get_genre_cat(genre):
    if genre in Rap:
        return 'Rap'
    elif genre in Techno:
        return 'Techno'
    else:
        return 'Pop'

df['genre_cat'] = df['genre'].apply(get_genre_cat)

方法2:使用np.select(更高效的多条件判断)

适合多分类场景,性能比循环和apply更优:

import numpy as np

Rap = ['Dark Trap', 'Hiphop', 'Rap', 'Underground Rap', 'RnB', 'trap', 'Trap Metal']
Techno = ['dnb', 'hardstyle', 'psytrance', 'techhouse', 'techno', 'trance']
Pop = ['pop']

# 定义条件和对应结果
conditions = [
    df['genre'].isin(Rap),
    df['genre'].isin(Techno)
]
choices = ['Rap', 'Techno']

# 按条件赋值,默认返回'Pop'
df['genre_cat'] = np.select(conditions, choices, default='Pop')

内容的提问来源于stack exchange,提问作者mustafa00

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:05:21