Получить количество совпадающих слов в строке pandas столбца с предопределенным списком - PullRequest
0 голосов
/ 08 июля 2020

У меня DataFrame содержит столбцы index и text.

Например:

index | text
1     | "I have a pen, but I lost it today."
2     | "I have pineapple and pen, but I lost it today."

Теперь у меня длинный список, и я хочу сопоставить каждый слов в text со списком.

Скажем:

long_list = ['pen', 'pineapple']

Я хотел бы создать FunctionTransformer, чтобы сопоставить слова в long_list с каждым словом значение столбца, если есть совпадение, вернуть счет.

index | text                                             | count
1     | "I have a pen, but I lost it today."             | 1
2     | "I have pineapple and pen, but I lost it today." | 2

Я сделал таким образом:

def count_words(df):
    long_list = ['pen', 'pineapple']
    count = 0
    for c in df['tweet_text']:
        if c in long_list:
            count = count + 1
            
    df['count'] = count   
    return df

count_word = FunctionTransformer(count_words, validate=False)

Пример того, как я разрабатываю свой другой FunctionTransformer будет быть:

def convert_twitter_datetime(df):
    df['hour'] = pd.to_datetime(df['created_at'], format='%a %b %d %H:%M:%S +0000 %Y').dt.strftime('%H').astype(int)
    return df

convert_datetime = FunctionTransformer(convert_twitter_datetime, validate=False)

Ответы [ 3 ]

2 голосов
/ 08 июля 2020

Pandas имеет str.count:

# matching any of the words
pattern = r'\b{}\b'.format('|'.join(long_list))

df['count'] = df.text.str.count(pattern)

Вывод:

   index                                              text  count
0      1              "I have a pen, but I lost it today."      1
1      2  "I have pineapple and pen, but I lost it today."      2
0 голосов
/ 09 июля 2020

На основе ответа @Quang Hoang

import pandas as pd
import sklearn as sk

y=['pen', 'pineapple']

def count_strings(X, y):
    pattern = r'\b{}\b'.format('|'.join(y))
    return X['text'].str.count(pattern)

string_transformer = sk.preprocessing.FunctionTransformer(count_strings, kw_args={'y': y})
df['count'] = string_transformer.fit_transform(X=df)

приводит к

    text                                              count
1   "I have a pen, but I lost it today."                1
2   "I have pineapple and pen, but I lost it today.     2

И для следующих df2:

#df2
      text
1     "I have a pen, but I lost it today. pen pen"
2     "I have pineapple and pen, but I lost it today."

мы получаем

string_transformer.transform(X=df2)
#result
1    3
2    2
Name: text, dtype: int64

Это показывает, что мы преобразовали функцию в объект в стиле sklearn. Чтобы еще больше абстрагироваться от этого, мы можем передать имя столбца в качестве аргумента ключевого слова в count_strings.

0 голосов
/ 09 июля 2020

Объединить элементы в списке с помощью |. Найдите совпадающие элементы с помощью .str.findall() и примените .str.len() для подсчета

 p='|'.join(long_list)
df=df.assign(count=(df.text.str.findall(p)).str.len())
                                             text   count
0              "I have a pen, but I lost it today."      1
1  "I have pineapple and pen, but I lost it today."      2
...