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

如何用Python基于ID列条件填充DataFrame的Retailer列?

解决Pandas中基于列条件填充新列的问题

嘿,我来帮你搞定这个问题!你的思路没问题,但直接用if/else处理整个DataFrame列会踩两个坑:

  1. 你的ID列是字符串类型(看你定义的data里ID都是带引号的),但你判断的时候用的是数字(比如112),类型不匹配导致永远匹配不上;
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:20:08