pandas:仅对某些ID将权重应用于另一列

cclgggtu  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(311)

让我们以此示例 Dataframe 和此ID列表为例:

df=pd.DataFrame({'Id':['A','A','A','B','C','C','D','D'], 'Weight':[50,20,30,1,2,8,3,2], 'Value':[100,100,100,10,20,20,30,30]})

  Id  Weight  Value
0  A      50    100
1  A      20    100
2  A      30    100
3  B       1     10
4  C       2     20
5  C       8     20
6  D       3     30
7  D       2     30

L = ['A','C']

值列对id列中的每个id具有相同的值。对于l的特定ID,我想将权重列的权重应用于值列。我目前正在采用以下方法,但使用真正的大 Dataframe 速度非常慢:

for i in L :
    df.loc[df["Id"]==i,"Value"] = (df.loc[df["Id"]==i,"Value"] * df.loc[df["Id"]==i,"Weight"] / 
    df[df["Id"]==i]["Weight"].sum())

我怎样才能有效地做到这一点?
预期产出:

Id  Weight  Value
0  A      50     50
1  A      20     20
2  A      30     30
3  B       1     10
4  C       2      4
5  C       8     16
6  D       3     30
7  D       2     30
j5fpnvbx

j5fpnvbx1#

idea仅适用于按筛选的行 Series.isin 具有 GroupBy.transformsum 对于与原始 Dataframe 大小相同的每个组的总和:

L = ['A','C']

m = df['Id'].isin(L)
df1 = df[m].copy()
s = df1.groupby('Id')['Weight'].transform('sum')
df.loc[m, 'Value'] = df1['Value'].mul(df1['Weight']).div(s)

print (df)
  Id  Weight  Value
0  A      50   50.0
1  A      20   20.0
2  A      30   30.0
3  B       1   10.0
4  C       2    4.0
5  C       8   16.0
6  D       3   30.0
7  D       2   30.0

相关问题