大熊猫获得最高5%的分数

时间:2018-07-19 14:41:38

标签: python pandas dataframe pandas-groupby

我正在使用看起来像这样的数据框:

score  name  country   date   id
1     name1  country1  date1  id1
5     name1  country1  date2  id2
6     name1  country1  date3  id3
9     name2  country2  date1  id4
5     name2  country2  date2  id5
5     name2  country2  date2  id5
7     name2  country3  date2  id5
2     name2  country3  date2  id5
1     name2  country3  date3  id6
2     name3  country4  date1  id7
6     name3  country4  date1  id8
7     name3  country4  date1  id9

我想获取按国家/地区分组的每个名称的ID,其中得分是该名称组的前5%。最后,它应该看起来像这样:

name   country   score date  id
name1  country1    6   date2 id2
                   5   date3 id3
name2  country2    9   date2 id2
name2  country3    7   date2 id2
name3  country4    7   date2 id2

2 个答案:

答案 0 :(得分:3)

IIUC,

g = df.groupby('country')
g.apply(lambda r: r[r.score >= r.score.quantile(0.95)])


                score   name    country     date    id
country                     
country1    2   6      name1    country1    date3   id3
country2    3   9      name2    country2    date1   id4
country3    6   7      name2    country3    date2   id5
country4    11  7      name3    country4    date1   id9

答案 1 :(得分:2)

您可以将groupbytransformquantile一起使用。例如,对于前60%的用户:

df = pd.DataFrame([['A', 'UK', 5], ['A', 'UK', 2], ['A', 'UK', 3], ['A', 'UK', 6],
                   ['B', 'US', 2], ['B', 'US', 5], ['B', 'US', 1], ['B', 'US', 11]],
                  columns=['name', 'country', 'score'])

quantile = df.groupby(['name', 'country'])['score'].transform('quantile', 0.60)
mask = df['score'] > quantile

res = df[mask]

print(res)

  name country  score
0    A      UK      5
3    A      UK      6
5    B      US      5
7    B      US     11
相关问题