我有一个df:
main_id b_code Scores
1 ABC 0.56
1 ABC 0.21
1 BCD 0.7
1 QWE 0.3
1 ZXC 0.8
2 ABC 0.26
2 ABC 0.81
2 BCD 0.24
2 QWE 0.87
2 ZXC 0.43
我必须为每个main_id找到前2个b_code,具体取决于他们的分数。
我的最终结果应该是:
main_id b_code Scores
1 ZXC 0.8
1 ABC 0.56
2 QWE 0.87
2 ABC 0.81
我尝试使用groupby和nlargest,但结果是错误的。
答案 0 :(得分:2)
您可以使用sort_values
+ groupby
+ GroupBy.head
:
df = df.sort_values(['main_id','Scores'], ascending=[True,False]).groupby('main_id').head(2)
print (df)
main_id b_code Scores
4 1 ZXC 0.80
2 1 BCD 0.70
8 2 QWE 0.87
6 2 ABC 0.81
或set_index
所有列中没有main_id
和Scores
+ groupby
+ nlargest
+ reset_index
:
df = df.set_index('b_code').groupby('main_id')['Scores'].nlargest(2).reset_index()
print (df)
main_id b_code Scores
0 1 ZXC 0.80
1 1 BCD 0.70
2 2 QWE 0.87
3 2 ABC 0.81