在 pandas 数据帧上创建和更新组行总和

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

我有一个包含学生及其学校科目的数据框:

主题 马克
海伦
艺术 20
哲学 16.8
经济 12
科林
数学 19.2
地理 17
历史 15

对于每个科目,都有不同的权重,权重因学期而异,并影响学生的总成绩:

主题 重量
艺术 0.1
哲学 0.6
经济 0.2
数学 0.5
地理 0.01
哲学 0.5
历史 0.3
数学 0.6

我正在考虑实现某种带有连接方法的vlook up,但由于权重发生变化,我必须更新表格。 不过,我想在浏览权重表时将输出打印在文件中。在这种情况下,我知道我可以使用 for 循环,但这不是最优化的方法。

我可以在这种情况下使用任何类型的 lamda 吗? 此外,有什么方法可以识别每个学生的总变化何时并输出?我正在考虑从数据框中创建子组,然后检查累积和?

本质上,在迭代上面的权重表时,我希望我的输出是: 主题 = 分数 * 体重,但还要考虑和跟踪学生总数的变化,因此:

 Art: 0.2 
 Philosophy: 10.08 
 Economics: 2.4
Helen: 12.68
 Maths: 9.6 
 Geography: 0.17 
 Philosophy:8.4 
Helen:11 
 History:4.5 
Colin: 14.27
 Maths:11.52 
Colin:16.19
python pandas dataframe stream sum
1个回答
0
投票

虽然拥有内部标头并不理想,但您可以使用

map
+
mul
isna
groupby.transform
:

的组合来计算预期输出
# build mapping series withou unique Subjects
s = weights.drop_duplicates('Subject').set_index('Subject')['Weight']

# compute the weighted Mark
df['Weighted_Mark'] = df['Mark'].mul(df['Subject'].map(s))

# identify Names
m = df['Mark'].isna()
# compute total
df.loc[m, 'Weighted_Mark'] = df.groupby(m.cumsum())['Weighted_Mark'].transform('sum')

输出:

      Subject  Mark  Weighted_Mark
0       Helen   NaN          14.48
1         Art  20.0           2.00
2  Philosophy  16.8          10.08
3   Economics  12.0           2.40
4       Colin   NaN          14.27
5       Maths  19.2           9.60
6   Geography  17.0           0.17
7     History  15.0           4.50
© www.soinside.com 2019 - 2024. All rights reserved.