基于df1与df2构建新DataFrame:优先保留df1的frn,缺失时取df2值
Pandas DataFrame按规则合并填充
原始数据
现有两个Pandas DataFrame:
import pandas as pd df1 = pd.DataFrame({'call_sign': ['ASD','BSD','CDSF','GFDFD','FHHH'],'frn':['123','124','','656','']}) df2 = pd.DataFrame({'call_sign': ['ASD','CDSF','BSD','GFDFD','FHHH'],'frn':['1234','','124','','765']})
需求说明
要生成新的DataFrame,满足:
call_sign的排列顺序和df1完全一致frn字段优先使用df1对应行的值;若df1中该位置frn为空字符串,则取df2中相同call_sign对应的frn值
目标结果
最终得到的DataFrame如下:
df_result = pd.DataFrame({'call_sign': ['ASD','BSD','CDSF','GFDFD','FHHH'],'frn':['123','','124','656','765']})
解决方案
方法一:映射填充缺失值
先把df2转换成call_sign到frn的映射表,再对df1的空值进行填充:
# 构建df2的call_sign与frn的映射关系 frn_map = df2.set_index('call_sign')['frn'] # 复制df1作为结果基础,处理frn字段 df_result = df1.copy() # 把空字符串转为缺失值,填充后若仍有缺失则转回空字符串 df_result['frn'] = df_result['frn'].replace('', pd.NA).fillna(df_result['call_sign'].map(frn_map)).fillna('')
方法二:条件判断赋值
用numpy.where直接通过条件逻辑赋值,思路更直观:
import numpy as np df_result = df1.copy() # 当df1的frn不为空时用自身值,否则取df2对应call_sign的frn值 df_result['frn'] = np.where(df_result['frn'] != '', df_result['frn'], df_result['call_sign'].map(df2.set_index('call_sign')['frn']))
两种方法都能精准实现需求,且完整保留df1的call_sign顺序。
内容的提问来源于stack exchange,提问作者abhi krishnan
相关产品推荐
相关产品推荐

