如何基于多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_1 | id_2 | value1 | value2 |
|---|---|---|---|
| 1 | 2 | 100 | 101 |
| 10 | 2 | 345 | 345 |
| 10 | 20 | 200 | 202 |
如果要添加你示例里的无匹配行(比如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
相关产品推荐
相关产品推荐

