#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'])