处理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
我有一个数据框输出,如下所示,并且总是有可变数量的数字列,在这里表示为 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