Python:基于条件用另一DataFrame的值替换列中指定值
解决方案:根据Ticket匹配替换DataFrame中的ERROR值
示例数据
先定义符合场景的两个DataFrame:
import pandas as pd # 存在ERROR值的df1 df1 = pd.DataFrame({ 'Ticket': [3453, 1234, 2364, 5678], 'Client': ['ERROR', 'Google', 'ERROR', 'Microsoft'], 'OtherCol': ['A', 'B', 'C', 'D'] }) # 存储正确Ticket-Client映射的df2 df2 = pd.DataFrame({ 'Ticket': [3453, 2364, 9999], 'Client': ['Alphabet', 'AMD', 'Apple'] })
方法1:映射字典+mask替换
先把df2转成Ticket到Client的映射字典,再针对性替换df1里的ERROR值:
# 构建Ticket与Client的映射字典 ticket_client_map = df2.set_index('Ticket')['Client'].to_dict() # 仅替换Client列中为'ERROR'的行,用对应Ticket的Client值 df1['Client'] = df1['Client'].mask(df1['Client'] == 'ERROR', df1['Ticket'].map(ticket_client_map)) # 如果需要保留未匹配到的ERROR(避免变成NaN),加fillna df1['Client'] = df1['Client'].mask(df1['Client'] == 'ERROR', df1['Ticket'].map(ticket_client_map)).fillna(df1['Client'])
方法2:合并DataFrame+combine_first
通过合并两个表,再优先保留原有效值,补充映射值:
# 按Ticket合并,只引入df2的Client列 merged_df = df1.merge(df2[['Ticket', 'Client']], on='Ticket', how='left', suffixes=('', '_correct')) # 用combine_first:原Client不是ERROR就留着,是ERROR就用df2的对应值 df1['Client'] = merged_df['Client'].combine_first(merged_df['Client_correct'])
最终效果
处理后的df1会变成:
Ticket Client OtherCol 0 3453 Alphabet A 1 1234 Google B 2 2364 AMD C 3 5678 Microsoft D
内容的提问来源于stack exchange,提问作者exenlediatán
相关产品推荐
相关产品推荐

