Подсчитайте, сколько раз столбец содержит определенное значение в Pandas - PullRequest
0 голосов
/ 25 июня 2018

Скажем, мой фрейм данных выглядит так:

   column_name
1  book
2  fish
3  icecream|book
4  fish
5  campfire|book

Теперь, если я использую df['column_name'].value_counts(), он скажет мне, что fish является наиболее частым значением.

Однако я хочу, чтобы book был возвращен, поскольку строки 1, 3 и 5 содержат слово «книга».

Я знаю, .value_counts() распознает icecream|book как одно значение, но есть ли способ определить наиболее частое значение, посчитав, сколько раз каждая ячейка столбца СОДЕРЖИТ определенное значение, так что «книга» будет наиболее частое значение?

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

pd.value_counts

Вы также можете передать список в функцию value_counts.Заметьте, что I join на |, затем разделите на |.

pd.value_counts('|'.join(df.column_name).split('|'))

book        3
fish        2
icecream    1
campfire    1
dtype: int64

get_dummies

Это работает, потому что ваши данные структурированы с | в качестверазделитель.Если у вас был другой разделитель, передайте его на get_dummies вызов df.column_name.str.get_dummies(sep='|').sum()

df.column_name.str.get_dummies().sum()

book        3
campfire    1
fish        2
icecream    1
dtype: int64

Если вы хотите отсортировать результаты

df.column_name.str.get_dummies().sum().sort_values(ascending=False)

book        3
fish        2
icecream    1
campfire    1
dtype: int64

pd.factorize и np.bincount

Обратите внимание, что я join весь столбец и снова разделить.

f, u = pd.factorize('|'.join(df.column_name).split('|'))
pd.Series(np.bincount(f), u)

book        3
fish        2
icecream    1
campfire    1
dtype: int64

Для сортировки мы можем использовать sort_values, как мы делали выше.Или это

f, u = pd.factorize('|'.join(df.column_name).split('|'))
counts = np.bincount(f)
a = counts.argsort()[::-1]
pd.Series(counts[a], u[a])

book        3
fish        2
campfire    1
icecream    1
dtype: int64
0 голосов
/ 25 июня 2018

Использование collections.Counter + itertools.chain:

from collections import Counter
from itertools import chain

c = Counter(chain.from_iterable(df['column_name'].str.split('|')))

res = pd.Series(c)

print(res)

book        3
campfire    1
fish        2
icecream    1
dtype: int64
0 голосов
/ 25 июня 2018

Использование split с stack для Series:

a = df['column_name'].str.split('|', expand=True).stack().value_counts()
print (a)
book        3
fish        2
icecream    1
campfire    1
dtype: int64

Или Counter со списком со сплющиванием:

from collections import Counter

a = pd.Series(Counter([y for x in df['column_name'] for y in x.split('|')]))
print (a)
book        3
fish        2
icecream    1
campfire    1
dtype: int64
...