如何在Python中为两列中的每个唯一值计算加权平均值?

2024-06-28 15:48:41 发布

您现在位置:Python中文网/ 问答频道 /正文

下图显示了我用Python打印的几行列表。我想得到:一份自治区唯一值列表,一份相应的年份唯一值列表,以及一份“平均值”加权平均值列表,其中“NOB”作为权重,但针对每个自治区和每年(变量“类型”表示在一个自治区的特定年份中是否只有一种、两种或三种类型)

我知道如何使用整个列表获得加权平均值:

weighted_avg = np.average(average, weights=nobs)

但我不知道如何计算每一个独特的行政区年的一个

enter image description here

我是Python新手,如果你知道怎么做,请帮助我


Tags: 类型列表npavg平均值权重行政区average
1条回答
网友
1楼 · 发布于 2024-06-28 15:48:41

假设“type”列不影响您的计算,您可以使用groupby获得平均值。以下是数据:

df = pd.DataFrame({'borough': ['b1', 'b2']*6, 'year': [2008, 2009, 2010, 2011]*3,
          'average': np.random.randint(low=100, high=200, size=12), 
          'nobs': np.random.randint(low=1, high=40, size=12)})
print(df):
   borough  year  average  nobs
0       b1  2008      166     1
1       b2  2009      177    35
2       b1  2010      114    27
3       b2  2011      187    18
4       b1  2008      193     2
5       b2  2009      105    27
6       b1  2010      114    36
7       b2  2011      144     3
8       b1  2008      114    39
9       b2  2009      157     6
10      b1  2010      133    17
11      b2  2011      176    12

我们添加了一个新列,它是average和nobs列的乘积:

df['average x nobs'] = df['average']*df['nobs']
newdf = pd.DataFrame({'weighted average': df.groupby(['borough', 'year']).sum()['average x nobs']/df.groupby(['borough', 'year']).sum()['nobs']})
print(newdf):
              weighted average
borough year                  
b1      2008        119.000000
        2010        118.037500
b2      2009        146.647059
        2011        179.090909

相关问题 更多 >