如何在Python中按除少数列之外的所有列进行分组?

问题描述 投票:0回答:2

我想按几列(大约 40 列)进行分组并应用汇总总和。 40 列是数据集的最后 40 列。我还没有找到一种优雅的方法来做到这一点。

我尝试按“column_before”列之后的所有列进行分组。

df.groupby('grouping_variable')['column_before':].sum()

TypeError: unhashable type: 'slice'

预期结果是一个数据帧,其中最后 40 列相对于“grouping_variable”聚合为总和

python pandas-groupby
2个回答
5
投票

您可以通过多种方式实现它:

import pandas as pd


df = pd.DataFrame({
     'col_to_group': ['A', 'A', 'B', 'B', 'A'],
     'col_1': ['a', 'b', 'c', 'a', 'a'],
     'col_2': ['x', 'y', 'y', 'y','x'],
     'col_3': [.1, .2, .1, .9, .7],
     'col_4': [.1, .2, .1, .9, .7],
})


df.groupby('col_to_group')['col_3', 'col_4'].sum()

只需选择列列表的一部分(切片运算符):

df.groupby('col_to_group')[df.columns[3:]].sum()
df.groupby('col_to_group')[df.columns[:2:-1]].sum().iloc[:, ::-1] 

使用列名称

'col_3'
iloc
:

df.groupby('col_to_group')[df.loc[:, 'col_3':].columns].sum()

与列表选择类似,但带有

iloc
:

df.groupby('col_to_group')[df.iloc[:, 3:].columns].sum()
df.groupby('col_to_group')[df.iloc[:, :2:-1].columns].sum().iloc[:, ::-1] 

结果:

              col_3  col_4
col_to_group              
A               1.0    1.0
B               1.0    1.0


1
投票

一种选择是使用列表理解来定义要分组的列。

假设您想对除

col_a
col_b
之外的所有内容进行分组。也许您想对这些进行总结。你可以这样做

sum_cols = ['col_a', 'col_b']
sums = df.groupby([c for c in df.columns if c not in sum_cols])[sum_cols].sum()

另一种选择是

sums = df.groupby(list(df.columns.drop(sum_cols)))[sum_cols].sum()
© www.soinside.com 2019 - 2024. All rights reserved.