在DataFrame中组合重复的列

Kyl*_*ndt 16 python group-by dataframe pandas pandas-groupby

如果我的数据框具有包含相同名称的列,是否有办法将具有相同名称的列与某种函数(即总和)组合在一起?

例如:

In [186]:

df["NY-WEB01"].head()
Out[186]:
                NY-WEB01    NY-WEB01
DateTime        
2012-10-18 16:00:00  5.6     2.8
2012-10-18 17:00:00  18.6    12.0
2012-10-18 18:00:00  18.4    12.0
2012-10-18 19:00:00  18.2    12.0
2012-10-18 20:00:00  19.2    12.0
Run Code Online (Sandbox Code Playgroud)

我如何通过对列名相同的每一行进行求和来折叠NY-WEB01列(有一堆重复的列,而不仅仅是NY-WEB01)?

met*_*ore 20

我相信这就是你所追求的:

df.groupby(lambda x:x, axis=1).sum()
Run Code Online (Sandbox Code Playgroud)

或者,根据df的长度,快3%到15%之间:

df.groupby(df.columns, axis=1).sum()
Run Code Online (Sandbox Code Playgroud)

编辑:要超出总和,请使用.agg()(缩写.aggregate()):

df.groupby(df.columns, axis=1).agg(numpy.max)
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 6

v0.20 +答案:GroupBywith levelaxisarguments

您在这里不需要lambda,也不必显式查询df.columnsgroupby接受level可以与axis参数一起指定的参数。IMO,这更干净。

# Setup
np.random.seed(0)
df = pd.DataFrame(np.random.choice(50, (5, 5)), columns=list('AABBB'))
df

    A   A   B   B   B
0  44  47   0   3   3
1  39   9  19  21  36
2  23   6  24  24  12
3   1  38  39  23  46
4  24  17  37  25  13
Run Code Online (Sandbox Code Playgroud)

df.groupby(level=0, axis=1).sum()

    A    B
0  91    6
1  48   76
2  29   60
3  39  108
4  41   75
Run Code Online (Sandbox Code Playgroud)

处理MultiIndex

另一个要考虑的情况是在处理MultiIndex列时。考虑

df.columns = pd.MultiIndex.from_arrays([['one']*3 + ['two']*2, df.columns])
df
  one         two    
    A   A   B   B   B
0  44  47   0   3   3
1  39   9  19  21  36
2  23   6  24  24  12
3   1  38  39  23  46
4  24  17  37  25  13
Run Code Online (Sandbox Code Playgroud)

要跨上层执行聚合,请使用

df.groupby(level=1, axis=1).sum()

    A    B
0  91    6
1  48   76
2  29   60
3  39  108
4  41   75
Run Code Online (Sandbox Code Playgroud)

或者,如果仅按上层进行汇总,则使用

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

  one     two
    A   B   B
0  91   0   6
1  48  19  57
2  29  24  36
3  39  39  69
4  41  37  38
Run Code Online (Sandbox Code Playgroud)

替代解释:删除重复的列

如果您是来这里寻找如何简单地删除重复的列(不执行任何聚合)的,请使用Index.duplicated

df.loc[:,~df.columns.duplicated()]

    A   B
0  44   0
1  39  19
2  23  24
3   1  39
4  24  37
Run Code Online (Sandbox Code Playgroud)

或者,要保留最后一个,请指定keep='last'(默认为'first'),

df.loc[:,~df.columns.duplicated(keep='last')]

    A   B
0  47   3
1   9  36
2   6  12
3  38  46
4  17  13
Run Code Online (Sandbox Code Playgroud)

groupby上面两个解决方案的替代方案分别是df.groupby(level=0, axis=1).first()... .last()