Ранжирование нескольких строковых столбцов с использованием панд - PullRequest
0 голосов
/ 30 августа 2018

Фрейм данных, с которым я работаю, имеет три столбца с именами list1, list2 и list3, основанные на трех отдельных списках «лучших мест для жизни».

Желаемый выход:

Я хочу вернуть еще один столбец, серию или группу, в которой отображается общий рейтинг каждого города после того, как он учитывает положение во всех списках, поэтому Edingburgh будет возглавлять список, а другие будут следовать в зависимости от того, насколько они близки с точки зрения рейтинга к вершине каждого столбца. Чтобы уточнить, Эдингбург занимает 1-е место в list2 и list3.

Это будет выглядеть примерно так:

1 Edingburgh 
2 Hart 
3 Orkney, London, Solihull 
4 Rutland, Bristol Hertfordshire 
5 Wychavon, Newcastle, Northumberland

По сути, я хочу посмотреть общий рейтинг каждого города, когда все списки были учтены, и узнать, как этого можно достичь с помощью панд.

Что я пробовал?

Я надеялся, что будет простой способ ранжирования, используя что-то вроде 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

1 Ответ

0 голосов
/ 30 августа 2018

Вот один подход:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...