Замените ячейку наиболее частым словом в Pandas DataFrame - PullRequest
3 голосов
/ 13 апреля 2020

У меня есть DataFrame, подобный этому:

df = pd.DataFrame({'Source1': ['Corona,Corona,Corona','Sars,Sars','Corona,Sars',
                          'Sars,Corona','Sars'], 
'Area': ['A,A,A,B','A','A,B,B,C','C,C,B,C','A,B,C']})

df

                Source1     Area
0  Corona,Corona,Corona  A,A,A,B
1             Sars,Sars        A
2           Corona,Sars  A,B,B,C
3           Sars,Corona  C,C,B,C
4                  Sars    A,B,C

Я хочу проверить каждую ячейку в каждом столбце (реальные данные имеют много столбцов) и найти частоту каждого уникального слова (мы можем различить guish уникальные слова на «,»), и заменить всю запись на наиболее частое слово.

В случае с ie не имеет значения, какое слово заменить. Таким образом, желаемый результат будет выглядеть следующим образом:

df
    Source Area
0  Corona    A
1    Sars    A
2  Corona    B
3    Sars    C
4    Sars    A

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

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 13 апреля 2020

Создает DataFrame с Series.str.split и expand=True и используется DataFrame.mode с выбором первого столбца по позиции:

df['Source1'] = df['Source1'].str.split(',', expand=True).mode(axis=1).iloc[:, 0]
df['Area'] = df['Area'].str.split(',', expand=True).mode(axis=1).iloc[:, 0]
print (df)
  Source1 Area
0  Corona    A
1    Sars    A
2  Corona    B
3    Sars    C
4    Sars    A

Еще одна идея с collections.Counter.most_common:

from collections import Counter

f = lambda x: [Counter(y.split(',')).most_common(1)[0][0] for y in x]
df[['Source1', 'Area']] = df[['Source1', 'Area']].apply(f)
#all columns
#df = df.apply(f)
print (df)
  Source1 Area
0  Corona    A
1    Sars    A
2  Corona    B
3    Sars    C
4    Sars    A
0 голосов
/ 13 апреля 2020

Вот мое предложение, которое может быть исполнено в одной строке для каждой серии и не требует дополнительных imports.

df['Area'] = df['Area'].apply(lambda x: max(x.replace(',',''), key=x.count))

После замены всех , на символы, найденные в Area series, мы заменяем поле на элемент, который имеет наибольшее количество вхождений (или первый элемент в случае равных значений) с аргументом key=x.count.

Вы также можете использовать что-то подобное (продемонстрировано с серией Source1), возвращая максимум из списка элементов, созданных путем разделения поля.

df['Source1'] = df['Source1'].apply(lambda x: max(list(x.split(',')), key=x.count))
+---+---------+------+
|   | Source1 | Area |
+---+---------+------+
| 0 | Corona  | A    |
| 1 | Sars    | A    |
| 2 | Corona  | B    |
| 3 | Sars    | C    |
| 4 | Sars    | A    |
+---+---------+------+

Два метода, показанных выше, для выделения вариантов выбора; оба будут работать адекватно на одной или обеих сериях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...