Pandas中位数按分组数据分组

时间:2015-12-26 19:42:09

标签: python pandas group-by apply

我有一个包含用户,分数,时间的数据框,其中列出了每个用户的不同分数以及他们收到分数的次数:

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并申请以某种方式计算中位数?

我的问题 -

  1. 这是正确的做法吗?我的df非常大,所以解决方案必须节省时间。
  2. 如果确实是这样的话 - 你能告诉我怎么样?无论我做什么,它都会让我失败。

2 个答案:

答案 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}