PandasGroupBy计算满足一定条件的加权百分比

2024-05-23 21:42:04 发布

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

我有一个数据框,上面有这样的调查数据,每一行都是不同的应答者。在

weight    race      Question_1      Question_2      Question_3
   0.9   white               1               5               4
   1.1   asian               5               4               3
  0.95   white               2               1               5
  1.25   black               5               4               3
  0.80   other               4               5               2

每个问题都是从1到5的量表(实际数据中还有几个问题)。对于每一个问题,我试图计算回答5分的受访者的百分比,按种族分组并按权重列加权。在

我相信下面的代码可以用来计算按种族分组的每个问题回答5的百分比。但我不知道如何通过权重列来衡量它的权重。在

^{pr2}$

我对熊猫不熟悉。有人能解释一下怎么做吗?谢谢你的帮助。在

编辑:上面数据帧的期望输出如下所示。显然,真实的数据有更多的受访者(行)和更多的问题。在

        Question_1      Question_2      Question_3
white         0.00            0.49            0.51
black         1.00            0.00            0.00
asian         1.00            0.00            0.00
other         0.00            1.00            0.00   

谢谢。在


Tags: 数据代码权重black百分比questionotherwhite
2条回答

这里有一个解决方案,通过定义一个自定义函数并将该函数应用于每个列。然后,您可以将每个列连接到一个数据帧中:

def wavg(x, col):
    return (x['weight']*(x[col]==5)).sum()/x['weight'].sum()

grouped = df.groupby('race')
pd.concat([grouped.apply(wavg,col) for col in df.columns if col.startswith('Question')],axis=1)\
    .rename(columns = {num:f'Question_{num+1}' for num in range(3)})

输出:

^{pr2}$

下面是问题1的答案。你可以很容易地把它推广到其他问题上。在

# Define a dummy indicating a '5 response'
df['Q1'] = np.where(df['Question_1']==5 ,1, 0)

# Create a weighted version of the above dummy
df['Q1_w'] = df['Q1'] * df['weight']

# Compute the sum by race
ds = df.groupby(['race'])[['Q1_w', 'weight']].sum()

# Compute the weighted average
ds['avg'] = ds['Q1_w'] / ds['weight']

基本上,你首先用种族来计算权重和权重的总和,然后除以权重之和。 这就是加权平均数。在

相关问题 更多 >