Python 3.x Python Dataframe Panda-如果条件匹配,则计算加权和,并对结果进行分组

Python 3.x Python Dataframe Panda-如果条件匹配,则计算加权和,并对结果进行分组,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我想根据条件列上的条件计算加权和。 我有以下数据帧: df = pd.DataFrame({'criteria': [2, 2, 2, 3, 4, 5, 5, 9], 'weight': [1, 2, 3, 1, 2, 1, 2, 3], 'value': [0.2, 0.6, 0.1, 0.9, 0.8, 0.7, 0.3, 0.8]}) print(df) criteria weight value

我想根据
条件
列上的条件计算加权和。 我有以下数据帧:

df = pd.DataFrame({'criteria': [2, 2, 2, 3, 4, 5, 5, 9], 
                   'weight': [1, 2, 3, 1, 2, 1, 2, 3], 
                   'value': [0.2, 0.6, 0.1, 0.9, 0.8, 0.7, 0.3, 0.8]})
print(df)

   criteria  weight  value
0         2       1    0.2
1         2       2    0.6
2         2       3    0.1
3         3       1    0.9
4         4       2    0.8
5         5       1    0.7
6         5       2    0.3
7         9       3    0.8
weight
列的可能值为{1,2,3}

我想计算加权和df['weight']*df['value']当且仅当所有可能的
权重
和相同的
标准
值都有一行时,然后按
标准
值对它们进行分组。剩下的将是
NaN

在我的示例中,只有
df['criteria']==2的行填充此条件

因此,我们将:

   criteria  weighted_sum
0         2           1.7
1         3           NaN
2         4           NaN
3         5           NaN
4         9           NaN
   criteria  weighted_sum
0         2           1.7
1         3           NaN
2         4           NaN
3         5           NaN
4         9           NaN

这个怎么写?非常感谢

您可以使用
issubset
检查权重是否为组的子集,然后使用
序列求和。其中

weights = [1,2,3]
cond = df.groupby('criteria')['weight'].agg(lambda x: set(weights).issubset(set(x)))
(df['weight'].mul(df['value']).groupby(df['criteria']).sum()
                     .where(cond).reset_index(name='weighted_sum'))