Как перебирать список и группировать по частоте слов

#python #pandas #dataframe #pandas-groupby

#python #панды #фрейм данных #pandas-groupby

Вопрос:

Я пытаюсь определить, сколько раз слово появляется в списке из файла csv. Я пробовал:

 df['Size'] = df['Interests'].str.extract('([S]*[w])')
sizes = df.groupby('Size').size()
  

Где интересует столбец, который я анализирую. Однако этот код не работает. Вместо этого он печатает только первое слово каждой строки. Так, например, если столбец «Мои интересы» содержит следующие записи:

 Apple, Banana, Pear, Peach
Banana, Orange
Strawberry, Apple, Banana
Mango, Pear, Orange
  

Тогда мой столбец размеров будет содержать следующее:

 Apple        1
Banana       1
Strawberry   1
Mango        1
  

Вместо

 Apple        2
Banana       3
Strawberry   1
Mango        1
Pear         2
Peach        1
Orange       2
  

Как я могу это исправить? Я пытался поместить его в цикл, но получаю ошибки. Например, если я:

 for i in df['Interests']:
      df['Size'] = i.str.extract('([S]*[w])')
sizes = df.groupby('Size').size()
  

Я получаю сообщение об ошибке ‘float’ объект не имеет атрибута ‘str’.

Я также пробовал: for i in range(df['Interests']):

Но get: TypeError: объект ‘Series’ не может быть интерпретирован как целое число

Любые предложения о том, как это исправить? Спасибо.

Комментарии:

1. Пожалуйста, не публикуйте изображения ваших данных, публикуйте фактические данные и форматируйте их как код.

2. извините за это, я это исправил.

3. После публикации ответа я понял, что не знаю Pandas (это то, что вы используете, фрейм данных Pandas, верно?) достаточно хорошо, чтобы знать, как это сделать. Я вижу, как extract('([S]*[w])') получить только начало значения столбца, давая вам только первое слово. То, что я пытался сделать в своем коде, было разбито на несколько значений, что я и сделал. Но я не знаю, что делать с несколькими значениями. Я не могу просто присвоить им всем значение df[‘Size], верно? Этот код должен быть в контексте одной строки в вашей таблице, поэтому я не знаю, как заставить его обращаться к нескольким строкам.

4. Все в порядке, я все еще очень ценю, что вы пытаетесь помочь. Да, я использую фрейм данных Pandas. Я в той же лодке, что и вы, поскольку я все еще немного новичок в использовании pandas

5. Я не понимаю ваш ожидаемый результат, вам нужно только количество первого элемента?

Ответ №1:

Я не думаю, что базовых методов pandas будет достаточно для решения этой проблемы, поскольку кажется, что вы хотите подсчитывать слова внутри записей, а не просто подсчитывать записи, соответствующие некоторым критериям. Вероятно, вам нужно будет написать что-то, что перебирает записи, а затем слова внутри записей. Мне кажется разумным накапливать результаты в словаре. Вот пример:

 from collections import defaultdict
counts = defaultdict(int)
for entry in df['Interests'].values:
    for word in entry.split(','):
        # Perform any massaging required here, e.g. such as if you want to be case-insensitive
        counts[word]  = 1

# counts now maps words in the entire column to number of counts of those words
  

Ответ №2:

Вы можете использовать счетчик коллекций, который дает вам словарь с частотами элементов в списке. Поскольку у вас есть строковое представление списка слов в каждой строке, сначала разделите текст на эти списки.

 from collections import Counter
df['Size'] = df['Interests'].str.split(", ").map(lambda x: Counter(x))
print(df['Size'])