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

如何用Python根据条件替换DataFrame中Name列的对应代码值?

DataFrame中Name列的代码替换逻辑实现

原始DataFrame(df1)

Name                      Code
2000667 - APPLE IPHONE    2000667
2000667 - APPLE IPHONE    2000667
2005565 - APPLE IPHONE    CASE
2005565 - APPLE IPHONE    CASE
                          2005450
                          2002130
                          2637440
                          2637409
2003598 - SAMSUNG GALAXY  2113521
2003598 - SAMSUNG GALAXY  HEADSET
                          2637437
2003639 - APPLE IPHONE    2003639
2005565 - APPLE IPHONE    SCREEN

期望结果(df2)

Name                        Code
2000667 - APPLE IPHONE      2000667
2000667 - APPLE IPHONE      2000667
CASE - APPLE IPHONE         CASE
CASE - APPLE IPHONE         CASE
                            2005450
                            2002130
                            2637440
                            2637409
2113521 - SAMSUNG GALAXY    2113521
HEADSET - SAMSUNG GALAXY    HEADSET
                            2637437
2003639 - APPLE IPHONE      2003639
SCREEN - APPLE IPHONE       SCREEN

需求说明

  • 若Name列不为空,当Name列的代码部分(-左侧内容)与Code列对应值不一致时,将Name列的代码部分替换为Code列的值;
  • 若Name列为空,则保持为空。

原代码问题分析

用户尝试的代码存在两个核心问题:

  1. 在apply的lambda中直接引用df1['Code']是整列数据,而非当前行的Code值;
  2. 判断df1['Code'] in x的逻辑错误,应该提取Name列的代码部分再和当前行Code值对比。

正确实现代码

方法1:逐行处理(逻辑直观)

import pandas as pd

# 构造示例df1(空值用空字符串表示)
data = {
    'Name': [
        '2000667 - APPLE IPHONE', '2000667 - APPLE IPHONE',
        '2005565 - APPLE IPHONE', '2005565 - APPLE IPHONE',
        '', '', '', '',
        '2003598 - SAMSUNG GALAXY', '2003598 - SAMSUNG GALAXY',
        '',
        '2003639 - APPLE IPHONE', '2005565 - APPLE IPHONE'
    ],
    'Code': [
        '2000667', '2000667', 'CASE', 'CASE',
        '2005450', '2002130', '2637440', '2637409',
        '2113521', 'HEADSET', '2637437',
        '2003639', 'SCREEN'
    ]
}
df1 = pd.DataFrame(data)

def update_name(row):
    name = row['Name']
    code = row['Code']
    # 处理Name为空的情况
    if pd.isna(name) or name.strip() == '':
        return name
    # 分割Name,提取原始代码和产品名称
    parts = name.split(' - ', 1)
    if len(parts) != 2:
        return name  # 格式不符合则保持原内容
    original_code, product = parts
    # 对比代码,不一致则替换
    if original_code != code:
        return f"{code} - {product}"
    return name

df2 = df1.copy()
df2['Name'] = df2.apply(update_name, axis=1)
print(df2)

方法2:向量化处理(大数据集更高效)

import pandas as pd

df2 = df1.copy()

# 筛选Name不为空的行
valid_name_mask = df2['Name'].notna() & (df2['Name'].str.strip() != '')

# 分割Name列,提取原始代码和产品名称
df2.loc[valid_name_mask, 'original_code'] = df2.loc[valid_name_mask, 'Name'].str.split(' - ', 1).str[0]
df2.loc[valid_name_mask, 'product'] = df2.loc[valid_name_mask, 'Name'].str.split(' - ', 1).str[1]

# 替换需要更新的Name内容
replace_mask = valid_name_mask & (df2['original_code'] != df2['Code'])
df2.loc[replace_mask, 'Name'] = df2.loc[replace_mask, 'Code'] + ' - ' + df2.loc[replace_mask, 'product']

# 清理临时列
df2.drop(['original_code', 'product'], axis=1, inplace=True)

print(df2)

代码说明

  1. 两种方法都会先判断Name列是否为空,为空则直接保留;
  2. 对非空Name列,按-分割出原始代码和产品名称;
  3. 对比原始代码与Code列值,不一致则用Code值替换原始代码部分,拼接成新的Name内容;
  4. 向量化方法避免逐行循环,在大数据集下性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:20:30