我想按几列(大约 40 列)进行分组并应用汇总总和。 40 列是数据集的最后 40 列。我还没有找到一种优雅的方法来做到这一点。
我尝试按“column_before”列之后的所有列进行分组。
df.groupby('grouping_variable')['column_before':].sum()
TypeError: unhashable type: 'slice'
预期结果是一个数据帧,其中最后 40 列相对于“grouping_variable”聚合为总和
您可以通过多种方式实现它:
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
一种选择是使用列表理解来定义要分组的列。
假设您想对除
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()