#python #pandas
#python #pandas
Вопрос:
У меня есть фрейм данных, в котором в одном из столбцов есть строки со списком значений. Я хочу подсчитать количество встречаемости всех слов внутри списка среди всех строк.
Например: dataframe df
Column A Column B
animal [cat, dog, tiger]
place [italy, china, japan]
pets [cat, dog]
Тогда мне нужен результат в виде:
cat : 2
dog: 2
tiger: 1 and so on
Комментарии:
1. Что вы пробовали до сих пор?
Ответ №1:
Вам нужно сгладить значения до простого списка и посчитать значения — по Counter
или по Series.value_counts
:
from collections import Counter
s = pd.Series(Counter([y for x in df['Column B'] for y in x]))
print (s)
cat 2
dog 2
tiger 1
italy 1
china 1
japan 1
dtype: int64
Альтернативный вариант 1:
from itertools import chain
from collections import Counter
s = pd.Series(Counter(chain.from_iterable(df['Column B'])))
Альтернатива2:
s = pd.Series(np.concatenate(df['Column B'])).value_counts()
Медленная альтернатива в больших данных:
s = pd.Series(df['Column B'].sum()).value_counts()
Ответ №2:
Используйте счетчик из коллекций и распечатайте значения. Проверьте приведенный ниже код для справки.
import pandas as pd
#for counting the elements
from collections import Counter
#dataframe with list values in column B
df = pd.DataFrame([[1,['apple','mango','apple'],3],[1,['mango','mango','soni'],3]],columns=['A','B','C'])
#formatting the output post counting
for i,row in df.iterrows():
c = Counter(row['B'])
print(f'for index {i}')
for k in c.keys():
print(f'{k}: {c.get(k)}')