You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于字符串与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:55:18