如何合并单个DataFrame内的多个同名列,得到仅含foo和bar的两列
Pandas 多同名列合并方案
核心实现逻辑
因为每行同名列仅存在一个非空值,直接按列名对列分组,提取每行非空值即可完成合并。
完整代码示例
import pandas as pd import numpy as np # 构造和你描述结构一致的测试DataFrame df = pd.DataFrame( [ [1, np.nan, 1, np.nan, np.nan, np.nan, np.nan, np.nan], [np.nan, 3, np.nan, 2, np.nan, np.nan, np.nan, np.nan], [np.nan, np.nan, np.nan, np.nan, 3, 5, np.nan, np.nan], [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 7, 4] ], columns=['foo', 'foo', 'bar', 'bar', 'bar', 'foo', 'foo', 'bar'] ) # 核心合并代码:按列名分组,取每行第一个非空值 df_merged = df.groupby(level=0, axis=1).first()
可选兼容方案
如果担心存在某行同名列全空的异常场景,可使用sum方法加min_count参数避免错误输出0值:
# 仅当存在至少1个非空值时才返回计算结果,否则返回NaN df_merged = df.groupby(level=0, axis=1).sum(min_count=1)
如果你的空值是空字符串而非np.nan,先做格式转换再执行合并:
df = df.replace('', np.nan)
输出结果
最终得到的df_merged完全符合预期:
| 索引 | foo | bar |
|---|---|---|
| 0 | 1 | 1 |
| 1 | 3 | 2 |
| 2 | 5 | 3 |
| 3 | 7 | 4 |
内容的提问来源于stack exchange,提问作者Maths
相关产品推荐
相关产品推荐

