如何基于字符串与NaN值多条件拼接两个DataFrame?
解决方法
你的需求核心是根据df1每行非NaN的列名,匹配df2中G列对应的值,把df2的行拼接到对应行后。因为df1每行只有一个非空列,我们可以利用这个特性来实现匹配合并:
步骤1:标记df1每行非NaN的列名
先给df1添加一个临时列,记录每行唯一非空的列名:
# 遍历每行,筛选出非NaN的列名并取第一个(因为每行仅一个非空) df1['match_col'] = df1.apply(lambda row: row.dropna().index[0], axis=1)
步骤2:转换df2的格式以便匹配
把df2设置为以G列为索引,这样能快速通过列名匹配对应行:
df2_mapped = df2.set_index('G')
步骤3:合并两个DataFrame
用临时列match_col关联df2的索引,把E、F、G列合并到df1中:
result = df1.join(df2_mapped, on='match_col') # 调整列顺序,和你预期的结果一致 result = result[['MAPA', 'BETA', 'CHARLIE', 'DELTA', 'E', 'F', 'G']]
步骤4:清理临时列
result = result.drop('match_col', axis=1)
完整测试代码
如果需要复现你的数据,可以先构造df1和df2:
import pandas as pd import numpy as np # 构造df1 df1 = pd.DataFrame({ 'MAPA': [np.nan, 8.0, 19.0, np.nan, np.nan], 'BETA': [15.0, np.nan, np.nan, np.nan, np.nan], 'CHARLIE': [np.nan, np.nan, np.nan, 18.0, np.nan], 'DELTA': [np.nan, np.nan, np.nan, np.nan, 17.0] }) # 构造df2 df2 = pd.DataFrame({ 'E': [None, None, None, None], 'F': [100, 120, 140, 160], 'G': ['MAPA', 'BETA', 'CHARLIE', 'DELTA'] }) # 执行上述合并步骤 df1['match_col'] = df1.apply(lambda row: row.dropna().index[0], axis=1) df2_mapped = df2.set_index('G') result = df1.join(df2_mapped, on='match_col') result = result[['MAPA', 'BETA', 'CHARLIE', 'DELTA', 'E', 'F', 'G']].drop('match_col', axis=1) print(result)
运行后就能得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Adrien Lambert
相关产品推荐
相关产品推荐

