如何用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列为空,则保持为空。
原代码问题分析
用户尝试的代码存在两个核心问题:
- 在
apply的lambda中直接引用df1['Code']是整列数据,而非当前行的Code值; - 判断
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)
代码说明
- 两种方法都会先判断Name列是否为空,为空则直接保留;
- 对非空Name列,按
-分割出原始代码和产品名称; - 对比原始代码与Code列值,不一致则用Code值替换原始代码部分,拼接成新的Name内容;
- 向量化方法避免逐行循环,在大数据集下性能更优。
内容的提问来源于stack exchange,提问作者SGC
相关产品推荐
相关产品推荐

