如何基于另一分类列添加分类列?代码为何全分配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
相关产品推荐
相关产品推荐

