Я полагаю, вам нужно GroupBy.rank
и method='dense'
для ранга всегда увеличивается на 1 между группами по отсортированным значениям столбца Value
с преобразованием в integers
:
df['Rank'] = df.groupby("Country")["Value"].rank(method='dense', ascending=False).astype(int)
print (df)
Country Value Rank
0 Germany 102.1 1
1 Germany 90.3 2
2 Germany 44.6 3
3 Switzerland 59.9 1
4 Switzerland 35.3 2
5 Switzerland 21.6 3
Если нужен счетчик, то лучше использовать GroupBy.cumcount
:
df['Rank1'] = df.groupby("Country").cumcount() + 1
Различие лучше всего видно в измененных данных:
print (df)
Country Value
0 Germany 90.3 second largest per group - 2
1 Germany 102.1 largest per group - 1
2 Germany 44.6 third largest per group - 3
3 Switzerland 21.6
4 Switzerland 35.3
5 Switzerland 59.9
df['Rank'] = df.groupby("Country")["Value"].rank(method='dense', ascending=False).astype(int)
df['Rank1'] = df.groupby("Country").cumcount() + 1
print (df)
Country Value Rank Rank1
0 Germany 90.3 2 1
1 Germany 102.1 1 2
2 Germany 44.6 3 3
3 Switzerland 21.6 3 1
4 Switzerland 35.3 2 2
5 Switzerland 59.9 1 3