微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

df 多列的加权平均聚合

如何解决df 多列的加权平均聚合

我正在尝试计算数据框中多列的加权平均值。 这是我的数据样本

重量(公斤) 氮气
A 2020 01 10000 10 70
A 2020 01 15000 4 78
A 2021 05 12000 5 66
A 2021 05 10000 8 54
B 2021 08 14000 10 90
C 2021 08 50000 20 92
C 2021 08 40000 10 95

我想要的结果是这样的:

enter image description here

我尝试过的: 我可以使用此函数获得单列的正确加权平均值: (类似于:link

def wavg(df,value,weight):
    d = df[value]
    w = df[weight]
    try:
        return (d * w).sum() / w.sum()
    except ZeroDivisionError:
        return d.mean()

我可以将此函数应用于我的 df 的单列:

df2 = df.groupby(["Group","year","month"]).apply(wavg,"Calcium","Weight(kg").to_frame()

(不要介意不同的值,它们对于我笔记本中的数据是正确的)

enter image description here

明显的问题是这个函数只适用于单列,而我有很多列。因此我尝试了一个 for 循环:

column_list=[]
for column in df.columns:
  column_list.append(df.groupby(["Group",column,"Weight(kg").to_frame())

它正确计算值,但列被放置在彼此的顶部而不是彼此相邻。他们还缺少一个有用的列名:

enter image description here

如何调整我的代码以返回所需的 df?

解决方法

通过 concat()reset_index() 尝试:

df=pd.concat(column_list,axis=1).reset_index()

您可以在此处进行更改:

column_list=[]
for column in df.columns:
  column_list.append(df.groupby(["Group","year","month"]).apply(wavg,column,"Weight(kg").reset_index())

#Finally:

df=pd.concat(column_list,axis=1)
,

用于多列工作和避免删除用于分组的列的更改函数正在转换为 MultiIndex

def wavg(x,value,weight):
    d = x[value]
    w = x[weight]
    try:
        return (d.mul(w,axis=0)).div(w.sum())
    except ZeroDivisionError:
        return d.mean()

#columns used for groupby
groups = ["Group","Year","Month"]
#processing all another columns
cols = df.columns.difference(groups + ["Weight(kg)"],sort=False)

#create index and processing all columns by variable cols
df1 = (df.set_index(groups)
         .groupby(level=groups)
         .apply(wavg,cols,"Weight(kg)")
         .reset_index())
print (df2)
  Group  Year  Month    Calcium   Nitrogen
0     A  2020      1  28.000000   4.000000
1     A  2020      1  46.800000   2.400000
2     A  2021      5  36.000000   2.727273
3     A  2021      5  24.545455   3.636364
4     B  2021      8  90.000000  10.000000
5     C  2021      8  51.111111  11.111111
6     C  2021      8  42.222222   4.444444

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。