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

如何基于多ID列合并Pandas DataFrame行并填充NaN值?

Pandas实现按ID合并行并填充NaN的方法

当然可以实现!这是Pandas处理重复分组数据的常见场景,用分组+聚合的思路就能轻松搞定,具体步骤如下:

1. 构造示例数据

先还原你给出的原始DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id_1': [1, 1, 10, 10, 10],
    'id_2': [2, 2, 20, 20, 2],
    'value1': [100, np.nan, 200, np.nan, 345],
    'value2': [np.nan, 101, np.nan, 202, 345]
})

2. 核心处理代码

只需一行代码就能完成分组合并+填充NaN:

# 按id_1和id_2分组,取每个列的第一个非空值(自动互补填充NaN)
result_df = df.groupby(['id_1', 'id_2'], as_index=False).first()

3. 结果验证

运行后得到的result_df就是你想要的格式:

id_1id_2value1value2
12100101
102345345
1020200202

如果要添加你示例里的无匹配行(比如a,b,c,d),直接追加到原始DataFrame再运行上述代码即可,无重复分组的行会被完整保留:

# 添加无匹配行
df = pd.concat([df, pd.DataFrame({'id_1': ['a'], 'id_2': ['b'], 'value1': ['c'], 'value2': ['d']})], ignore_index=True)
# 重新执行分组合并
result_df = df.groupby(['id_1', 'id_2'], as_index=False).first()

此时结果就会包含a b c d这一行。

原理说明

  • groupby(['id_1', 'id_2']):把所有id_1和id_2完全匹配的行归为同一组;
  • as_index=False:确保分组后的id_1和id_2仍然是普通列,不会变成索引;
  • first():对每个分组的每一列,取第一个非NaN的值——因为同一组内的行是互补的(一行有value1无value2,另一行相反),所以刚好能合并成没有NaN的完整行;而无重复分组的行只有自己,自然会完整保留。

内容的提问来源于stack exchange,提问作者Mohammad Athar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:13:44