Pandas DataFrame.groupby().agg()问题

问题描述 投票:0回答:1

我正在尝试使用 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()

但我不知道如何正确编码

python pandas group-by aggregate
1个回答
0
投票

您无法直接使用

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
计算加权平均值,但这应该作为单独的操作完成。

© www.soinside.com 2019 - 2024. All rights reserved.