我正在使用看起来像这样的数据框:
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
答案 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)
您可以将groupby
和transform
与quantile
一起使用。例如,对于前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