pandas 的加权平均数据帧
Weighted mean dataframe with pandas
我遇到过许多其他加权平均 pandas 问题,但其中 none 似乎符合我的要求。我有以下 df:
Primary_Key Team Quantity Value 1 Value 2
0 A Blue 10 20 10
1 B Red 5 19 30
2 C Green 8 13 29
3 D Blue 12 24 18
4 E Red 15 25 19
5 F Green 12 18 23
我正在尝试计算每个团队的每个值的加权平均值,因此我会得到以下结果 result_df:
Team Quantity Value 1 Value 2
0 Blue 10 20*10/22 10*10/22
1 Red 5 19*5/20 30*5/20
2 Green 8 13*8/20 29*8/20
3 Blue 12 24*12/22 18*12/22
4 Red 15 25*15/20 19*15/20
5 Green 12 18*12/20 23*12/20
“值”列下的每个条目都进行了以下计算:
weighted_mean = 价值*(quantity/team的总数量)
我想我必须以某种方式使用 .apply(lambda x:...) 函数,但我不知道如何轻松获得团队总数量的值。我也遇到了 numpy.average 函数,但我认为它在这里没有用。
如有任何帮助,我们将不胜感激!
分解为步骤:
import pandas as pd
import numpy as np
df = pd.DataFrame(data={
'Primary_Key': list('ABCDEF'),
'Team': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Green'],
'Quantity': [10,5,8,12,15,12],
'v1': [20,19,13, 24,25,18],
'v2': [10,30,29,18,19,23]})
df['GroupQuantity'] = df.groupby('Team')['Quantity'].transform(np.sum)
df['v1'] = df['Quantity'] * df['v1'] / df['GroupQuantity']
df['v2'] = df['Quantity'] * df['v2'] / df['GroupQuantity']
df
Primary_Key Team Quantity v1 v2
0 A Blue 10 9.090909 4.545455
1 B Red 5 4.750000 7.500000
2 C Green 8 5.200000 11.600000
3 D Blue 12 13.090909 9.818182
4 E Red 15 18.750000 14.250000
5 F Green 12 10.800000 13.800000
现在,如果您正在寻找单衬垫,您可以这样做:
df[['v1', 'v2']] = df[['v1', 'v2']] * df['Quantity'].to_numpy()[:,None] / df.groupby('Team')['Quantity'].transform(np.sum).to_numpy()[:,None]
df
Primary_Key Team Quantity v1 v2
0 A Blue 10 9.090909 4.545455
1 B Red 5 4.750000 7.500000
2 C Green 8 5.200000 11.600000
3 D Blue 12 13.090909 9.818182
4 E Red 15 18.750000 14.250000
5 F Green 12 10.800000 13.800000
我遇到过许多其他加权平均 pandas 问题,但其中 none 似乎符合我的要求。我有以下 df:
Primary_Key Team Quantity Value 1 Value 2
0 A Blue 10 20 10
1 B Red 5 19 30
2 C Green 8 13 29
3 D Blue 12 24 18
4 E Red 15 25 19
5 F Green 12 18 23
我正在尝试计算每个团队的每个值的加权平均值,因此我会得到以下结果 result_df:
Team Quantity Value 1 Value 2
0 Blue 10 20*10/22 10*10/22
1 Red 5 19*5/20 30*5/20
2 Green 8 13*8/20 29*8/20
3 Blue 12 24*12/22 18*12/22
4 Red 15 25*15/20 19*15/20
5 Green 12 18*12/20 23*12/20
“值”列下的每个条目都进行了以下计算:
weighted_mean = 价值*(quantity/team的总数量)
我想我必须以某种方式使用 .apply(lambda x:...) 函数,但我不知道如何轻松获得团队总数量的值。我也遇到了 numpy.average 函数,但我认为它在这里没有用。
如有任何帮助,我们将不胜感激!
分解为步骤:
import pandas as pd
import numpy as np
df = pd.DataFrame(data={
'Primary_Key': list('ABCDEF'),
'Team': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Green'],
'Quantity': [10,5,8,12,15,12],
'v1': [20,19,13, 24,25,18],
'v2': [10,30,29,18,19,23]})
df['GroupQuantity'] = df.groupby('Team')['Quantity'].transform(np.sum)
df['v1'] = df['Quantity'] * df['v1'] / df['GroupQuantity']
df['v2'] = df['Quantity'] * df['v2'] / df['GroupQuantity']
df
Primary_Key Team Quantity v1 v2
0 A Blue 10 9.090909 4.545455
1 B Red 5 4.750000 7.500000
2 C Green 8 5.200000 11.600000
3 D Blue 12 13.090909 9.818182
4 E Red 15 18.750000 14.250000
5 F Green 12 10.800000 13.800000
现在,如果您正在寻找单衬垫,您可以这样做:
df[['v1', 'v2']] = df[['v1', 'v2']] * df['Quantity'].to_numpy()[:,None] / df.groupby('Team')['Quantity'].transform(np.sum).to_numpy()[:,None]
df
Primary_Key Team Quantity v1 v2
0 A Blue 10 9.090909 4.545455
1 B Red 5 4.750000 7.500000
2 C Green 8 5.200000 11.600000
3 D Blue 12 13.090909 9.818182
4 E Red 15 18.750000 14.250000
5 F Green 12 10.800000 13.800000