如何在Pandas DataFrame中为列添加含else条件的标签?
如何在Pandas DataFrame中为列添加含else条件的标签?
嘿,我看到你的问题啦,咱们一步步来解决~
首先,你遇到的问题大概率是因为字典定义时的语法错误:你写的label_dict = {'CRIME':1, 'BUSINESS':2, 'SPORTS':3 'ARTS':4}里,'SPORTS':3后面少了个逗号,这会直接导致字典创建失败,后续的apply操作自然会出问题。先把这个小错误修复掉,咱们再看其他优化方案。
方法一:修复你的原代码
把字典的语法修正后,你的apply逻辑本身是完全可行的:
import pandas as pd data = [['CRIME', 10], ['BUSINESS', 15], ['SPORTS', 12], ['TRAVEL', 2], ['WELLNESS', 3], ['ARTS', 25]] df = pd.DataFrame(data, columns=['category', 'no']) # 修复字典的逗号问题 label_dict = {'CRIME':1, 'BUSINESS':2, 'SPORTS':3, 'ARTS':4} # 你的apply方法,现在可以正常运行了 df['label'] = df['category'].apply(lambda x : label_dict[x] if x in label_dict else 5) print(df)
运行后就能得到你想要的结果,未匹配到的TRAVEL、WELLNESS都会被标记为5。
方法二:更简洁的Pandas向量化操作(推荐)
其实Pandas自带的map()函数更适合做这种映射操作,搭配fillna()可以一步搞定,代码更清爽,效率也更高(尤其是数据量大的时候):
df['label'] = df['category'].map(label_dict).fillna(5).astype(int)
map(label_dict)会把category列中匹配到字典键的值替换成对应标签,未匹配到的会返回NaNfillna(5)把所有NaN替换成5astype(int)确保标签是整数类型(因为map后可能会变成浮点型)
方法三:用replace实现
你也可以用replace()函数来完成映射,逻辑和上面类似:
df['label'] = df['category'].replace(label_dict).fillna(5).astype(int)
如果担心字符串匹配的问题,可以加上regex=False参数(默认就是False,这里可以明确写出来):
df['label'] = df['category'].replace(label_dict, regex=False).fillna(5).astype(int)
这几种方法都能实现你的需求,其中map()+fillna()是最推荐的,因为它更符合Pandas的向量化操作理念,代码简洁且执行效率高。
备注:内容来源于stack exchange,提问作者Bluetail
相关产品推荐
相关产品推荐

