我有一个数据框输出,如下所示,并且始终具有可变数量的数字列,此处表示为 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
关于python - 处理pandas中的多列和groupby/agg(无需手动分配所有聚合函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71860481/