Как получить ранжирование по частоте элементов подряд? - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть DataFrame с именем a. Я хочу получить два верхних наиболее часто встречающихся элемента в каждом ряду. Input:

import pandas as pd
a=pd.DataFrame({'A1':['food','movie','sport'],'A2':['game','traffic','health'],
'A3':['food','health','education'],'A4':['game','travel','other'],
'A5':['social','other','sport']})

Output:

      A1       A2         A3      A4      A5
0   food     game       food    game  social
1  movie  traffic     health  travel   other
2  sport   health  education   other   sport

Expected:

      top1       top2 
0   food     game    
1  health    movie    
2  sport   education

Как видите, возможно, некоторые элементы в строке появляются с одинаковой частотой. Для таких элементов я просто выбираю один из них для ранжирования, например, все элементы в строке 1 появляются один раз, поэтому я просто случайным образом выберите два из них для ранжирования.

Надеемся на помощь и спасибо!

Ответы [ 4 ]

0 голосов
/ 15 сентября 2018

вам нужен счетчик и применять функции,

from collections import Counter
out_df=pd.DataFrame((df.apply(Counter,axis=1).apply(list).str[:2]).values.tolist(),columns=['top1','top2'])
0 голосов
/ 15 сентября 2018

Использование:

a.apply(lambda x: pd.Series(x.value_counts().nlargest(2).index.tolist(), 
                            index=['top1','top2']), 
       axis=1)

Вывод:

      top1   top2
0     game   food
1  traffic  other
2    sport  other
0 голосов
/ 15 сентября 2018

Counter

from collections import Counter

tops = [
    [*zip(*Counter(r).most_common(2))][0]
    for r in zip(*map(a.get, a))
]

pd.DataFrame(tops, a.index, ['top1', 'top2'])

    top1     top2
0   food     game
1  movie  traffic
2  sport   health
0 голосов
/ 15 сентября 2018

Вы можете попробовать использовать счетчики значений и назначить наиболее встречающееся слово как верхнее и т. Д.

pd.DataFrame({'top1':a.apply(lambda x: x.value_counts().index[0],1 ).values,
              'top2':a.apply(lambda x: x.value_counts().index[1],1 ).values})

Из:

    top1    top2
0   game    food
1   traffic movie
2   sport   other
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...