如何合并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
相关产品推荐
相关产品推荐

