Панды: Сколько раз строка появляется в ячейке данных? - PullRequest
0 голосов
/ 04 марта 2019

Я считаю, что есть простая проблема.У меня есть pandas dataframe df, который выглядит примерно так:

data = [{"Text" : "Dog", "Dog" : 1},
        {"Text" : "Cat", "Dog" : 0}, 
        {"Text" : "Mouse", "Dog" : 0}, 
        {"Text" : "Dog", "Dog" : 1}]

df = pd.DataFrame(data)

Я пытаюсь найти в столбце Text несколько ключевых слов и посчитать, сколько раз они появляются в каждой ячейке.Предполагается, что результат будет сохранен в новом столбце, который показывает, сколько раз было найдено конкретное ключевое слово.Предполагается, что результат будет похож на столбец Dog.

Я пытался использовать pandas str.count.Работает просто отлично.Но в тот момент, когда я пытаюсь сохранить результат в новом столбце, у меня возникают проблемы:

mykewords = ('Cat', 'Mouse')
df['Cat'] = df.Text.str.count("Cat")

Я получаю следующее сообщение об ошибке:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  if __name__ == '__main__':

У меня два вопроса:

  1. Что я делаю не так и как я могу это исправить?
  2. Как можно просмотреть все ключевые слова в mykeywords и получить столбец для каждого?

Большое спасибо за любую помощь заранее!

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Просто обновите панд с последней версией и попробуйте код ниже.Это работает как очарование для меня.

import pandas as pd
data = [{"Text" : "Dog", "Dog" : 1},
        {"Text" : "Cat", "Dog" : 0}, 
        {"Text" : "Mouse", "Dog" : 0}, 
        {"Text" : "Dog", "Dog" : 1}]

df = pd.DataFrame(data)
mykewords = ['Cat', 'Mouse']
for i in mykewords:
    df[i] = df.Text.str.count(i)
0 голосов
/ 04 марта 2019

Если возможно несколько значений в тексте и необходимо подсчитать значения:

mykewords = ('Cat', 'Mouse')
for x in mykewords:
    df[x] = df.Text.str.count(x)

Лучшее решение - использовать границы слов с Series.str.findall и Series.str.len:

for x in mykewords:
    df[x] = df.Text.str.findall(r"\b{}\b".format(x)).str.len()

Разница в решениях:

data = [{"Text" : "Dog Cat Catman", "Dog" : 1},
        {"Text" : "Cat Cat", "Dog" : 0}, 
        {"Text" : "Mouse Cat", "Dog" : 0}, 
        {"Text" : "Dog", "Dog" : 1}]

df = pd.DataFrame(data)
df1 = df.copy()
print (df)
   Dog            Text
0    1  Dog Cat Catman
1    0         Cat Cat
2    0       Mouse Cat
3    1             Dog

mykewords = ('Cat', 'Mouse')

for x in mykewords:
    df[x] = df.Text.str.findall(r"\b{}\b".format(x)).str.len()
print (df)
   Dog            Text  Cat  Mouse
0    1  Dog Cat Catman    1      0 <-not match Catman
1    0         Cat Cat    2      0
2    0       Mouse Cat    1      1
3    1             Dog    0      0

for x in mykewords:
    df1[x] = df1.Text.str.count(x)
print (df1)
   Dog            Text  Cat  Mouse
0    1  Dog Cat Catman    2      0 <-match Catman
1    0         Cat Cat    2      0
2    0       Mouse Cat    1      1
3    1             Dog    0      0
...