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

如何合并Pandas DataFrame中同名的3列Year,用非空值填充NaN?

解决多列合并为单列(非空值填充NaN)的问题

你的操作错误分析

  • 错误1:combinedDF = combinedDF.loc[:,~df.columns.duplicated()].copy()
    • 这里误用了未定义的变量df,应替换为combinedDF;更关键的是,这个操作仅保留重复列的第一个实例,直接丢弃另外两个Year列的所有数据,完全无法实现“用非空值填充NaN”的需求。
  • 错误2:combinedDF.groupby(by="Year").sum()
    • groupby是按列值对行进行分组聚合的工具,而你的场景是同一行内的多个列需要合并,和这个方法的使用场景完全不匹配,因此没有效果。

正确实现方式

建议不要直接把三个列重命名为相同的Year(pandas允许重复列名,但会增加操作复杂度),先给它们临时命名区分,再合并:

步骤1:重命名列(避免重复列名)

# 将原有的#YY、YYYY、YY分别重命名为临时名称
combinedDF = combinedDF.rename(columns={'#YY': 'Year_temp1', 'YYYY': 'Year_temp2', 'YY': 'Year_temp3'})

步骤2:合并三列为单列(非空值填充)

用combine_first方法依次填充NaN,该方法会优先保留前一列的非空值,用后一列的非空值填充前一列的NaN:

# 先合并Year_temp1和Year_temp2,再用Year_temp3填充剩余NaN
combinedDF['Year'] = combinedDF['Year_temp1'].combine_first(combinedDF['Year_temp2']).combine_first(combinedDF['Year_temp3'])

步骤3:删除临时列

combinedDF = combinedDF.drop(['Year_temp1', 'Year_temp2', 'Year_temp3'], axis=1)

备选方法(如果已重命名为重复的Year列)

如果已经把三个列都改成了Year,可以通过列索引选择这三列,再合并:

# 选出所有名为Year的列,按行从右到左填充NaN后取第一列
combinedDF['Year'] = combinedDF.loc[:, 'Year'].bfill(axis=1).iloc[:, 0]
# 去重列,保留最后一个(即刚生成的合并后的Year列)
combinedDF = combinedDF.loc[:, ~combinedDF.columns.duplicated(keep='last')]

内容的提问来源于stack exchange,提问作者Darwin Tsou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:50:08