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
相关产品推荐
相关产品推荐

