Я думаю, вам нужно DataFrame.sort_values
с GroupBy.head
вместо nlargest
, потому что избегайте потерянного столбца choice
, а также улучшите производительность:
df0 = (data.groupby(["individual", "cluster"])["benchmark_probabilities"].nlargest(1)
.groupby("individual").nlargest(5))
print (df0)
individual individual cluster
9710535 9710535 5 7 0.163837
1 3 0.030648
3 14 0.027746
7 40 0.014945
2 10 0.014684
9710540 9710540 0 46 0.018614
1 49 0.005489
Name: benchmark_probabilities, dtype: float64
df1 = (data.sort_values(['individual','cluster','benchmark_probabilities'],
ascending=[True, True, False])
.groupby(["individual", "cluster"]).head(1)
.sort_values(['individual','benchmark_probabilities'],
ascending=[True, False])
.groupby("individual").head(5))
print (df1)
individual cluster choice benchmark_probabilities
7 9710535 5 0 0.163837
3 9710535 1 0 0.030648
14 9710535 3 0 0.027746
40 9710535 7 0 0.014945
10 9710535 2 0 0.014684
46 9710540 0 1 0.018614
49 9710540 1 0 0.005489
Затем отфильтруйте только строки из оригинала не в df1
и не выполните сортировку:
df2 = (data[~data.index.isin(df1.index)]
.sort_values(['individual','benchmark_probabilities'],
ascending=[True, False])
)
#print (df2)
Добавил t df1
и получите значения top5 по head
:
df = (pd.concat([df1, df2])
.groupby('individual').head(5)
.sort_values('individual'))
print (df)
individual cluster choice benchmark_probabilities
7 9710535 5 0 0.163837
3 9710535 1 0 0.030648
14 9710535 3 0 0.027746
40 9710535 7 0 0.014945
10 9710535 2 0 0.014684
46 9710540 0 1 0.018614
49 9710540 1 0 0.005489
47 9710540 0 0 0.006515
48 9710540 0 0 0.004040