Кадр данных, с которым я работаю, имеет три столбца с именем list1
, list2
и list3
на основе трех отдельных списков "лучших мест для жизни".
Желаемый результат:
Я хочу вернуть еще один столбец, серию или группу, который показывает общий рейтинг для каждого города после того, как он учитывает положение во всех списках, поэтому Edingburgh
возглавит список, а другие будут следовать в зависимости от того, насколько они близки к ранжированию на вершину каждого столбца. Для того, чтобы уточнить, Edingburgh занимает 1 место в list2
и list3
.
Он будет выглядеть примерно так:
1 Edingburgh
2 Hart
3 Orkney, London, Solihull
4 Rutland, Bristol Hertfordshire
5 Wychavon, Newcastle, Northumberland
В основном я хочу видеть общий рейтинг для каждого города, когда все списки были учтены и узнать, как это можно достичь с помощью Pandas.
Что я пробовал?
Я надеялся, что будет простой способ ранжирования с использованием чего-то типа places2live.rank()
но не вижу, как я могу использовать это со строковыми значениями.
Данные
list1 list2 list3
0 Hart Edinburgh Edinburgh
1 Orkney London Solihull
2 Rutland Bristol Hertfordshire
3 Wychavon Newcastle Northumberland
4 Winchester Manchester South Lanarkshire
5 Wokingham Glasgow Berkshire
6 Waverley Leeds Darlington
7 Craven Cardiff North Lanarkshire
Вот один из подходов:
cities = pd.Index(np.unique(df.values))
ranks = pd.Series([1] * len(cities), index=cities)
for column in df:
ranks = ((ranks + df.reset_index().set_index(column)['index'])/2).fillna(ranks)
city_ranks = ranks.reset_index().groupby(0)['index'].apply(list).reset_index(drop=True)
city_ranks.index += 1
print(city_ranks)
[выход]
1 [Edinburgh]
2 [Hart]
3 [London, Orkney, Solihull]
4 [Bristol, Hertfordshire, Rutland]
5 [Newcastle, Northumberland, Wychavon]
6 [Manchester, South Lanarkshire, Winchester]
7 [Berkshire, Glasgow, Wokingham]
8 [Darlington, Leeds, Waverley]
9 [Cardiff, Craven, North Lanarkshire]