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

Pandas新手求助:如何合并DataFrame中名称相同的列?

解决Pandas重复列名的合并问题

嘿,作为Pandas新手遇到这种重复列名的问题太正常啦,我来给你捋清楚怎么解决!

首先先把你的原始DataFrame和目标结果明确一下,方便理解:

你的原始DataFrame(修正排版后):

import pandas as pd
import numpy as np

df = pd.DataFrame(
    [[np.nan, np.nan, 2, np.nan, np.nan, 5],
     [np.nan, 1, np.nan, 9, np.nan, np.nan],
     [3, np.nan, np.nan, 7, np.nan, np.nan]],
    index=['a', 'b', 'c'],
    columns=['A', 'A', 'A', 'B', 'B', 'B']
)

输出后是这样的:

A    A    A    B    B    B
a  NaN  NaN  2.0  NaN  NaN  5.0
b  NaN  1.0  NaN  9.0  NaN  NaN
c  3.0  NaN  NaN  7.0  NaN  NaN

你想要的目标结果:

A  B
a  2  5
b  1  9
c  3  7

先说说你之前报错的原因

你用df.groupby(by=[A,B], axis=1)时,这里的A和B会被当成变量(而不是列名字符串);就算写成['A','B'],这个写法的逻辑是用这两列的数据作为分组依据,不是按列名分组,所以才会出现Grouper and axis must be same length的错误——因为你要按列分组(axis=1),但传入的分组键长度和列数不匹配呀。

正确的解决方法

其实很简单,我们要做的是把相同列名的列归为一组,然后提取每组里每行的非空值,因为你的数据里每个列组(A组、B组)的每行都只有一个有效数值,其他都是NaN,所以用first()或者max()聚合都可以:

方法一:按列名层级分组(推荐)

result = df.groupby(level=0, axis=1).first()

方法二:直接用列名作为分组键

result = df.groupby(df.columns, axis=1).max()

这两种方法都能得到你想要的结果,解释一下:

  • axis=1表示我们要按列来分组,而不是默认的行
  • level=0是因为你的列名是单层索引,直接按最外层的列名(也就是重复的"A"、"B")分组
  • first()会取每组里每行的第一个非空值,max()则是取最大值(因为NaN不参与计算,所以效果和first()一致)

运行后输出的result就是你想要的样子啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:31:31