我有一个包含用户,分数,时间的数据框,其中列出了每个用户的不同分数以及他们收到分数的次数:
user1, 1, 4
user1, 7, 2
user2, 3, 1
user2, 10, 2
等等。 我想为每个用户计算得分的中位数。 为此,我想我应该创建一个行重复的df,例如 -
user1,1
user1,1
user1,1
user1,1
user1,7
user1,7
user2,3
user2,10
user2,10
然后使用groupBy并申请以某种方式计算中位数?
我的问题 -
答案 0 :(得分:0)
我相信你需要weighted median。我使用了来自here的函数weighted_median
,您也可以尝试wquantile
的{{1}},但它会以不同的方式进行插值,因此您可能会获得无法预料的结果):
weighted.median
答案 1 :(得分:0)
df = pd.DataFrame({'user': ['user1', 'user1', 'user2', 'user2'],
'score': [1, 7, 3, 10],
'times': [4, 2, 1, 2]})
# Create dictionary of empty lists keyed on user.
scores = {user: [] for user in df.user.unique()}
# Expand list of scores for each user using a list comprehension.
_ = [scores[row.user].extend([row.score] * row.times) for row in df.itertuples()]
>>> scores
{'user1': [1, 1, 1, 1, 7, 7], 'user2': [3, 10, 10]}
# Now you can use a dictionary comprehension to calculate the median score of each user.
>>> {user: np.median(scores[user]) for user in scores}
{'user1': 1.0, 'user2': 10.0}