如何用Python基于ID列条件填充DataFrame的Retailer列?
解决Pandas中基于列条件填充新列的问题
嘿,我来帮你搞定这个问题!你的思路没问题,但直接用if/else处理整个DataFrame列会踩两个坑:
- 你的
ID列是字符串类型(看你定义的data里ID都是带引号的),但你判断的时候用的是数字(比如112),类型不匹配导致永远匹配不上; df['ID']是一个Series对象,不能像单个值那样直接用in做判断,Pandas会因为无法把整个Series的布尔结果转换成单个布尔值而报错。
下面给你两种常用的解决方案,效果和SQL的CASE语句完全一致:
方法一:字典映射 + map函数(简洁首选)
这种方法最直观,就像做一个键值对的匹配表,维护起来特别方便:
import pandas as pd data = {'ID':['112','5898','32','9985','23','577','17','200','156']} df = pd.DataFrame(data) # 先创建ID到Retailer的映射字典,把相同Retailer的ID放一起 retailer_map = { '112': 'Webmania', '32': 'Webmania', '5898': 'DataHub', '9985': 'TorrentJunkie', '23': 'Apptronix' } # 使用map匹配,找不到匹配值的用fillna填充为'Other' df['Retailer'] = df['ID'].map(retailer_map).fillna('Other') print(df)
方法二:numpy.select(更接近SQL CASE WHEN,灵活适配复杂条件)
如果你的条件不止是简单的等于,还涉及范围、多列组合判断,这种方法会更合适:
import pandas as pd import numpy as np data = {'ID':['112','5898','32','9985','23','577','17','200','156']} df = pd.DataFrame(data) # 定义条件列表,每个元素是一个布尔Series conditions = [ df['ID'].isin(['112', '32']), # 多个ID匹配同一个Retailer df['ID'] == '5898', df['ID'] == '9985', df['ID'] == '23' ] # 定义和条件对应的结果列表,顺序要和conditions一一对应 choices = [ 'Webmania', 'DataHub', 'TorrentJunkie', 'Apptronix' ] # np.select会按顺序匹配条件,匹配到第一个满足的就返回对应的结果,都不满足就用default df['Retailer'] = np.select(conditions, choices, default='Other') print(df)
这两种方法运行后,都会得到你期望的输出:
ID Retailer 0 112 Webmania 1 5898 DataHub 2 32 Webmania 3 9985 TorrentJunkie 4 23 Apptronix 5 577 Other 6 17 Other 7 200 Other 8 156 Other
内容的提问来源于stack exchange,提问作者Mg Mogaki
相关产品推荐
相关产品推荐

