Панды - датафрейм, содержащий комментарии (строки) и слова в виде заголовков столбцов, как получить частоту? - PullRequest
1 голос
/ 10 ноября 2019

Я пытаюсь выполнить подсчет частоты слов на относительно большом фрейме данных и не знаю, какой подход будет наилучшим.

В настоящее время мой фрейм данных выглядит следующим образом -

 Comment        'I'    'it'    'is'    'up'

'I was here'    NaN    NaN     NaN     NaN
'I like soup'   NaN    NaN     NaN     NaN
'whats up'      NaN    NaN     NaN     NaN
'This is it'    NaN    NaN     NaN     NaN

Моя цель - выполнить подсчет частоты для каждого слова в заголовках столбцов («I», «it», «is», «up») для каждого комментария. Например, после процесса подсчета результат должен выглядеть примерно так -

 Comment        'I'    'it'    'is'    'up'

'I was here'     1      0        0      0
'I like soup'    1      0        0      0
'whats up'       0      0        0      1
'This is it'     0      1        1      0

Каков наилучший подход к этому? Реальный набор данных содержит около 50 тыс. Комментариев и более 10 тыс. Столбцов с разными словами.

Ответы [ 4 ]

2 голосов
/ 10 ноября 2019

Я не думаю, что есть лучший способ, чем:

for column in df.columns[1:]: # All but comment column.
   df[column] = df[column].str.contains(df['Comment'])

Это даст вам матрицу логических значений, которую вы можете отобразить в биты, если вам действительно нужно.

1 голос
/ 10 ноября 2019

Использование str.findall с Counter, если вам нужно регулярное выражение:

from collections import Counter

df = pd.DataFrame({"Comment":['I was here I','I like soup','whats up','This is it'],})

comments = ['I','it','is','up']

s = df["Comment"].str.findall("|".join(fr"\b{i}\b" for i in comments)).apply(Counter)

print (pd.concat([df, s.apply(pd.Series)], axis=1))

#
        Comment    I   up   is   it
0  I was here I  2.0  NaN  NaN  NaN
1   I like soup  1.0  NaN  NaN  NaN
2      whats up  NaN  1.0  NaN  NaN
3    This is it  NaN  NaN  1.0  1.0
1 голос
/ 10 ноября 2019

Вы можете использовать функции Counter() и itemgetter():

from collections import Counter
from operator import itemgetter

iget = itemgetter(*df.columns[1:])
df.iloc[:, 1:] = df['Comment'].str.split().\
apply(lambda x: pd.Series(iget(Counter(x))))
1 голос
/ 10 ноября 2019

Я могу думать только о том, чтобы использовать цикл for:

for target in df.columns:
    for sentence in df.index:
        n = 0
        for word in sentence.split(' '):
            print(word)
            if word == target:
                n += 1
        df.loc[sentence, target] = n

Однако я согласен с @rafaelc и у меня есть сомнения относительно дизайна вашей установки.

...