如何在数据框中合并具有相同列名的列

3

我是pandas的新手。我的数据集看起来像这样:

  A   A   A   B   B   B
a NaN NaN 2   NaN NaN 5
b NaN 1   NaN 9   NaN NaN
c 3   NaN     NaN 7   NaN

我怎样才能获得

  A   B 
a 2   5
b 1   9 
c 3   7

似乎合并和连接是用于多个数据框的。我也尝试过。
df.groupby(by=[A,B], axis=1)

但收到了
ValueError: Grouper and axis must be same length

df.groupby(level=0, axis=1).sum() 是什么意思? - jezrael
3个回答

6

我相信你需要使用汇总函数,例如summeanfirstlast等来指定第一级:

import pandas as pd

df = df.groupby(level=0, axis=1).sum()
print (df)
     A    B
a  2.0  5.0
b  1.0  9.0
c  3.0  7.0

如果需要按列名称筛选列,请使用subset:

df = df[['A','B']].groupby(level=0, axis=1).sum()

如果使用索引值:

df1 = df.T
print (df1)
     a    b    c
A  NaN  NaN  3.0
A  NaN  1.0  NaN
A  2.0  NaN  NaN
B  NaN  9.0  7.0
B  NaN  NaN  NaN
B  5.0  NaN  NaN

df = df1.groupby(level=0).sum()
#default parameter axis=0 should be omit above
#df = df1.groupby(level=0, axis=0).sum()
print (df)
     a    b    c
A  2.0  1.0  3.0
B  5.0  9.0  7.0

好的,这样做就可以了。但我的问题是:为什么我必须指定一个级别?我认为只有当轴1中有多个级别时才需要级别,而这并不是这种情况。 - xiaoshir
@edge27 - 我认为这是因为在处理列名时,如果需要使用索引,则必须指定它。df.T.groupby(level=0).sum()df.T.groupby(level=0, axis=0).sum()相同。因此,对于列需要axis=1来获取列,并且对于第一级需要level=0。我还认为这是为了区分列中的MultiIndex,然后可以始终指定级别,例如df = df.groupby(level=1, axis=1).sum() - jezrael

2
也许可以使用first
df.groupby(df.columns,axis=1).first()
Out[35]: 
     A    B
a  2.0  5.0
b  1.0  9.0
c  3.0  7.0

由于df.groupby(df.columns,axis=1)是一个pandas.core.groupby.DataFrameGroupBy对象,我无法看到它的样子,所以你能解释一下.first()是做什么的吗? - xiaoshir
@edge27 它将返回每个组的第一个非空值。 - BENY

0
一种简洁的方法是使用带有numpy.isfinite的列表推导式:
import pandas as pd, numpy as np

arr = [list(filter(np.isfinite, x)) for x in df.values]

res = pd.DataFrame(arr, columns=['A', 'B'], index=['a', 'b', 'c'], dtype=int)

结果:

   A  B
a  2  5
b  1  9
c  3  7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接