【问题标题】:How to join columns sharing the same name within a dataframe如何在数据框中连接共享相同名称的列
【发布时间】:2018-09-01 01:55:14
【问题描述】:

我是熊猫新手。我的 df 看起来像这样:

  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() 怎么样?

标签: python pandas join duplicates


【解决方案1】:

我相信您需要使用聚合函数指定第一级,例如 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

如果需要按名称过滤列,请使用子集:

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 中有多个级别时才需要级别,但事实并非如此。
  • @edge27 - ithink 因为使用列名,如果需要使用索引,请指定它,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()
【解决方案2】:

一种简洁的方法是使用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

【讨论】:

    【解决方案3】:

    也许使用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() 做什么?
    • @edge27 它将返回每个组的第一个非空值
    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2021-12-17
    相关资源
    最近更新 更多