我有一个df
:
field category 2022-01-10 2022-01-17 2022-01-24 2022-01-31
A Chair 50 100 200 150
B Chair 75 15 57 75
C Chair 0.57 0.64 0.4 0.47
A Table 50 100 200 150
B Table 75 15 57 75
C Table 0.57 0.64 0.4 0.47
A Mirror 50 100 200 150
B Mirror 75 15 57 75
C Mirror 0.57 0.64 0.4 0.47
我尝试按字段
进行分组,或者简单地删除category
列并聚合每周的值,以便结果如下所示:
field 2022-01-10 2022-01-17 2022-01-24 2022-01-31
A 50+50+50 100+100+100 200+200+200 150+150+150
B 75+75+75 15+15+15 57+57+57 75+75+75
C np.mean([0.57, 0.57, 0.57]) # each weeks average of field C
对于字段 A 和 B
,每周我都会汇总该周不同类别的值,但对于字段 C
,我想要平均值。
我尝试过:
df.groupby(['field']).agg({'A':sum, 'B':sum, 'C'.np.mean})
但这当然不起作用,因为字段是分组依据,而不是列。
我相信这个问题可以通过某种方式删除category
列,然后根据field
列转换值来解决,但我不确定这是如何工作的。
最佳答案
创建要应用的函数字典,然后平整数据框并按字段
和变量
(日期)列进行分组。使用groupby
的第一个索引来获取正确的函数。最后 reshape 你的数据框。
aggfuncs = {'A': lambda x: np.sum(x),
'B': lambda x: np.sum(x),
'C': lambda x: np.mean(x)}
out = df.melt(['field', 'category']).groupby(['field', 'variable'])['value'] \
.apply(lambda x: aggfuncs[x.name[0]](x)).unstack() \
.rename_axis(columns=None).reset_index()
print(out)
# Output
field 2022-01-10 2022-01-17 2022-01-24 2022-01-31
0 A 150.00 300.00 600.0 450.00
1 B 225.00 45.00 171.0 225.00
2 C 0.57 0.64 0.4 0.47
关于python - 按列分组并为 group by 中使用的特定列分配不同的聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71237703/