如何将一个DataFrame列的值替换为另一个DataFrame的对应值
嗨,这个需求用Pandas很容易实现,核心就是基于STRESC和CATEGORY的组合匹配,把TERMS表的P_TERM映射到FINDINGS表里。我给你两种实用的方法,你可以根据自己的场景选择:
方法一:字典映射(高效简洁)
这种方法适合数据量较大的场景,先把TERMS表转换成一个复合键的映射字典,再快速匹配替换:
import pandas as pd # 假设你已经读取好了两个DataFrame:terms_df(对应TERMS表)、findings_df(对应FINDINGS表) # 构建(STRESC, CATEGORY) -> P_TERM的映射字典 term_map = terms_df.set_index(['STRESC', 'CATEGORY'])['P_TERM'].to_dict() # 给FINDINGS表添加新的P_TERM列,或者直接替换STRESC列 # 示例1:添加P_TERM列,匹配不到则保留原STRESC值 findings_df['P_TERM'] = findings_df.apply( lambda row: term_map.get((row['STRESC'], row['CATEGORY']), row['STRESC']), axis=1 ) # 示例2:直接替换STRESC列的值 # findings_df['STRESC'] = findings_df.apply( # lambda row: term_map.get((row['STRESC'], row['CATEGORY']), row['STRESC']), # axis=1 # )
说明:
set_index把STRESC和CATEGORY设为复合索引,转成字典后可以直接通过(STRESC值, CATEGORY值)快速查找对应的P_TERMapply逐行处理,get方法的第二个参数是默认值,确保匹配不到的情况下保留原数据,避免出现缺失值
方法二:左连接合并(直观易理解)
如果是新手,用Pandas的merge左连接会更直观,步骤清晰:
# 左连接两个表,基于STRESC和CATEGORY匹配 merged_df = pd.merge( findings_df, terms_df, on=['STRESC', 'CATEGORY'], how='left' ) # 替换STRESC列:如果匹配到P_TERM就用它,否则保留原STRESC值 merged_df['STRESC'] = merged_df['P_TERM'].fillna(merged_df['STRESC']) # 不需要P_TERM列的话可以删掉 merged_df = merged_df.drop(columns=['P_TERM'])
说明:
how='left'保证FINDINGS表的所有行都被保留,即使没有匹配到TERMS表的记录fillna用来处理匹配不到的情况,保留原STRESC的值- 如果TERMS表中存在同一
(STRESC, CATEGORY)对应多个P_TERM的情况,合并后会生成重复行,需要先对TERMS表去重:terms_df = terms_df.drop_duplicates(subset=['STRESC', 'CATEGORY'])
注意事项
- 确保两个表的
STRESC和CATEGORY列数据类型一致,且没有多余空格(比如字符串前后的空格),否则会匹配失败。可以先做清洗:# 清洗列的空格 for col in ['STRESC', 'CATEGORY']: terms_df[col] = terms_df[col].str.strip() findings_df[col] = findings_df[col].str.strip()
内容的提问来源于stack exchange,提问作者summersmd
相关产品推荐
相关产品推荐

