pandas: столбец с самой высокой строкой - PullRequest
0 голосов
/ 08 января 2020

У меня есть таблица слов со смешанными категориальными классификациями. Я хочу сделать так, чтобы столбец «общего типа» имел метку классификации самого высокого уровня (режима), чтобы каждая строка имела метку.

word   type          common type
post | WORK_OF_ART | WORK_OF_ART 
post | WORK_OF_ART | WORK_OF_ART 
post | WORK_OF_ART | WORK_OF_ART 
post | WORK_OF_ART | WORK_OF_ART 
post | WORK_OF_ART | WORK_OF_ART 
post |       OTHER | WORK_OF_ART 
post | WORK_OF_ART | WORK_OF_ART 
post | WORK_OF_ART | WORK_OF_ART 
post |       OTHER | WORK_OF_ART
-----|--------------------------
sign |       OTHER | OTHER
sign | WORK_OF_ART | OTHER 
sign |       OTHER | OTHER
sign | WORK_OF_ART | OTHER 
sign |       OTHER | OTHER 
sign |       OTHER | OTHER 
sign | WORK_OF_ART | OTHER 

I следующая функция, но на фрейме данных 1m + строк, время выполнения которых ужасно

def replace_most_common_type(frame, word):
    common_type = frame[frame['word']==word]['type'].value_counts().idxmax()
    frame.loc[frame['word']==word, 'type'] = common_type

unique_words = master_frame['word'].unique()
for idx, word in unique_words:
    replace_most_common_type(master_frame, word)

встроенные pandas методы имеют тенденцию быть numpy векторизованными, поэтому любое решение, использующее собственные функции pandas, ценится

1 Ответ

2 голосов
/ 09 января 2020

С учетом ваших данных:

In [1]: df
Out[1]:
    word         type
0   post  WORK_OF_ART
1   post  WORK_OF_ART
2   post  WORK_OF_ART
3   post  WORK_OF_ART
4   post  WORK_OF_ART
5   post        OTHER
6   post  WORK_OF_ART
7   post  WORK_OF_ART
8   post        OTHER
9   sign        OTHER
10  sign  WORK_OF_ART
11  sign        OTHER
12  sign  WORK_OF_ART
13  sign        OTHER
14  sign        OTHER
15  sign  WORK_OF_ART

Вы можете выполнить группирование по слову, а затем найти наиболее распространенный тип по слову, используя value_counts, как показано в этого ответа . Обратите внимание, что вы можете сохранить «наиболее распространенную» серию в переменной, а затем переименовать ее, чтобы имена столбцов не конфликтовали.

In [2]: s = df.groupby('word')['type'].agg(lambda x: x.value_counts().index[0])
   ...: s.name = 'common type'
   ...: df.merge(s, on='word')
Out[2]:
    word         type  common type
0   post  WORK_OF_ART  WORK_OF_ART
1   post  WORK_OF_ART  WORK_OF_ART
2   post  WORK_OF_ART  WORK_OF_ART
3   post  WORK_OF_ART  WORK_OF_ART
4   post  WORK_OF_ART  WORK_OF_ART
5   post        OTHER  WORK_OF_ART
6   post  WORK_OF_ART  WORK_OF_ART
7   post  WORK_OF_ART  WORK_OF_ART
8   post        OTHER  WORK_OF_ART
9   sign        OTHER        OTHER
10  sign  WORK_OF_ART        OTHER
11  sign        OTHER        OTHER
12  sign  WORK_OF_ART        OTHER
13  sign        OTHER        OTHER
14  sign        OTHER        OTHER
15  sign  WORK_OF_ART        OTHER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...