我正在尝试使用 pandas groupby().agg() 但我遇到了一些问题。
Date Year Month Week Hour A B C D E F G ..
mercoledì 5 aprile 2023 4 14 5 6 6 144,79 0 868,74 6 36
mercoledì 5 aprile 2023 4 14 6 214 214 144,79 0 30985,0 6 214
mercoledì 5 aprile 2023 4 14 6 6 6 144,79 0 868,74 6 36
mercoledì 5 aprile 2023 4 14 7 220 220 180,26 0 39657,2 220 48
mercoledì 5 aprile 2023 4 14 7 100 100 180,26 146 18026 100 10
mercoledì 5 aprile 2023 4 14 8 220 220 225,2 0 49544 220 48
mercoledì 5 aprile 2023 4 14 8 57 57 2,2 146 129,38 6 57
我必须对一些列进行求和(这与 agg({'column':sum}) 一起使用,对其他列进行加权平均,权重位于一列中,并且必须对其余列进行mean()。
df = df.groupby(['Date','Hour']).agg({'A':'sum',
'B':'sum',
'C': weighted average?,
'D':'sum',
'E':'mean'}).reset_index()
我想对C进行加权平均,权重是B列中的值。
然后,对于 .agg() 中未指示的列(F、G 等,我有很多列),我想应用方法 .mean(),将所有列保留在最后。
你能帮我吗? 谢谢你
尝试过这个:
df = df.groupby(['Date','Hour']).agg({'A':'sum',
'B':'sum',
'C': weighted average?,
'D':'sum',
'E':'mean'}).reset_index()
但我不知道如何正确编码
您无法直接使用
agg
计算加权平均值,因为这需要两列*。
一种方法是对计算进行预处理/后处理。加权平均值等于
sum(C*B)/sum(B)
:
out = (df.eval('C = C*B')
.groupby(['Date', 'Hour'])
.agg({'A': 'sum',
'B': 'sum',
'C': 'sum',
'D': 'sum',
'E': 'mean'})
.eval('C = C/B')
.reset_index()
)
注意。如果您已经使用 B/C 计算不同的聚合,则需要使用它们的副本。
要处理所有列,您可以使用字典:
d = {c: 'mean' for c in df.columns.difference(['Date', 'Hour'])}
for c in ['A', 'B', 'C', 'D']:
d[c] = 'sum'
out = (df.eval('C = C*B')
.groupby(['Date', 'Hour'], as_index=False)
.agg(d)
.eval('C = C/B')
)
* 不过,您可以使用
groupby.apply
计算加权平均值,但这应该作为单独的操作完成。