Как извлечь и суммировать уникальные слова из pandas DataFrame - PullRequest
4 голосов
/ 15 апреля 2020

Рассмотрим следующий фрейм данных:

df = pd.DataFrame({'animals': [['dog','cat','snake','lion','tiger'], 
                  ['dog','moose','alligator','lion','tiger'], 
                  ['eagle','moose','alligator','lion','tiger'],
                  ['cat','alligator','lion']]})

Мне нужно извлечь каждое уникальное животное и суммировать количество вхождений. Вывод должен выглядеть примерно так:

dog             2  
cat             2  
snake           1  
lion            4  
tiger           3  
moose           2  
alligator       3  
eagle           1 

Аналогично тому, что делает df.value_counts ().

Очень ценится.

Ответы [ 4 ]

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

В одну сторону с Counter + chain

import pandas as pd
from collections import Counter
from itertools import chain

pd.Series(Counter(chain.from_iterable(df['animals'])))

dog          2
cat          2
snake        1
lion         4
tiger        3
moose        2
alligator    3
eagle        1
dtype: int64
3 голосов
/ 15 апреля 2020

Вы можете использовать explode и value_counts:

df.animals.explode().value_counts()

Выход:

lion         4
tiger        3
alligator    3
moose        2
cat          2
dog          2
eagle        1
snake        1
Name: animals, dtype: int64
2 голосов
/ 15 апреля 2020

Подход карты / сокращения

reduce(Counter.__add__, map(Counter, df.animals))

Или, чтобы уменьшить количество итераций

reduce(lambda a,b: Counter(a) + Counter(b), df.animals)

>>> pd.Series(res)

dog          2
cat          2
snake        1
lion         4
tiger        3
moose        2
alligator    3
eagle        1
dtype: int64

(Не забудьте сначала импортировать reduce: from functools import reduce, как это было удалено как встроенная функция в python3).

1 голос
/ 15 апреля 2020

Вы можете сделать это следующим образом:

bb = [val for in_arr in df['animals'].tolist() for val in in_arr]
Counter(bb)
...