我有一个包含调查数据的数据框,每一行都是不同的受访者。
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 的百分比,按种族分组。但我不知道如何通过权重列对其进行加权。
df.groupby('race').apply(lambda x: ((x == 5).sum()) / x.count())
我是 Pandas 的新手。有人可以解释一下如何做到这一点吗?谢谢你的帮助。
编辑:上述数据框的所需输出看起来像这样。显然,真实数据有更多的受访者(行)和更多的问题。
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
谢谢。
最佳答案
这是一个通过定义自定义函数并将该函数应用于每一列的解决方案。然后您可以将每一列连接成一个数据框:
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)})
输出:
Question_1 Question_2 Question_3
race
asian 1.0 0.000000 0.000000
black 1.0 0.000000 0.000000
other 0.0 1.000000 0.000000
white 0.0 0.486486 0.513514
关于python - Pandas GroupBy计算满足一定条件的加权百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54298464/