处理pandas中的许多列和groupby/agg(无需手动分配所有聚合函数)

Dealing with many columns and groupby/agg in pandas (without manually assigning all aggregation functions)

我有一个数据框输出,如下所示,并且总是有可变数量的数字列,在这里表示为 t1-t4。

hash         name group trial t1 t2 t3 t4
1AomKHNL56l  EP1  G01   clump 1  4   5   9
2oKA7J1B3GL  EP2  G02   green 2  10  0   24
zsfAu5Q6I60  EP1  G01   clump 4  3   1   3
v68fGHY8zx1  EP2  G02   green 1  5   9  22

我想做的是将数据框分组到“组”类别中,并对我知道可以使用的所有数字列求和

df.groupby(["group"]).sum()

虽然这会删除我所有的非数字列,但我想要一些动态的东西。对于“哈希列”,我想要一些看起来像这样的输出:

df.groupy(["group"]).agg("hash":list)

对于其他非数字列,我只想按原样维护它们,因为它们在唯一组 ID 中都是相同的。所以最终结果会是这样的:

hash                      name group trial t1 t2 t3 t4
[1AomKHNL56l,zsfAu5Q6I60] EP1  G01   clump 5  7   6   12
[2oKA7J1B3GL,v68fGHY8zx1] EP2  G02   green 3  15  9   46

现在我能想到的唯一方法是分别为每个唯一的列案例执行 agg 和 sum 函数,然后在最后合并数据帧,或者在 agg 函数中输入每个列 id。我想知道是否有人知道在 groupby 函数中本地执行此操作的方法,而无需所有额外的数据帧合并步骤或必须列出每个列 ID 和要执行的操作。也许是某种 lambda 语句?

散列、名称、组和试验的列 ID 始终相同,但数字列始终具有不同的名称,具体取决于正在查看哪些样本组以供参考。

您可以使用聚合函数字典:

# default is sum
d = {c: 'sum' for c in df.columns}

# change a few other columns
d.update({'hash': list, 'name': 'first', 'group': 'first', 'trial': 'first'})

# aggregate
df.groupby('group', as_index=False).agg(d)

设置字典的替代选项:

d = {'first': ['name', 'group', 'trial'],
     'sum': ['t1', 't2', 't3', 't4'],
     list: ['hash']}

d = {k:v for v,l in d.items() for k in l}

df.groupby('group', as_index=False).agg(d)[df.columns]

注意。你也把两者结合起来!

输出:

                         hash name group  trial  t1  t2  t3  t4
0  [1AomKHNL56l, zsfAu5Q6I60]  EP1   G01  clump   5   7   6  12
1  [2oKA7J1B3GL, v68fGHY8zx1]  EP2   G02  green   3  15   9  46