как посчитать количество слов для каждого столбца, который находится в структуре массива в Pandas - PullRequest
0 голосов
/ 28 июня 2018

У меня есть строковый столбец в моем фрейме данных, где я разделил предложения на слова. Теперь мне нужно вычислить вхождение этого слова и преобразовать их в столбцы. Основное создание матрицы терминов документа

0                   [kubernetes, client, bootstrapping, ponda]
1                                                [micro, insu]
2                                                 [motor, upi]
3                                  [secure, app, installation]
4                    [health, insu, express, credit, customer]
5                                  [secure, app, installation]
6                                                 [aap, insta]
7                               [loan, house, loan, customers]

Выход:

    kubernetes  client  bootstrapping   ponda   loan    customers   installation
0        1       1      1               1       0           0        0
1        0       0      0               0       1           0        1
2        0       2      0               0       0           0        0
3        1       1      1               1       0           0        0

Код до сих пор

 from sklearn.feature_extraction.text import CountVectorizer

 countvec = CountVectorizer()

 countvec.fit_transform(df.new)

Ошибка:

AttributeError: у объекта 'list' нет атрибута 'lower'

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Чтобы использовать CountVectorizer так, как вы его использовали, ваш DataFrame должен выглядеть следующим образом:

                                  string
0  kubernetes client bootstrapping ponda
1                             micro insu
2                              motor upi
3                secure app installation
4    health insu express credit customer
5                secure app installation
6                              aap insta
7              loan house loan customers

На данный момент у вас это так:

                                   stringList
0  [kubernetes, client, bootstrapping, ponda]
1                               [micro, insu]
2                                [motor, upi]
3                 [secure, app, installation]
4   [health, insu, express, credit, customer]
5                 [secure, app, installation]
6                                [aap, insta]
7              [loan, house, loan, customers]

Итак, вот как вы преобразуете его так, как вам необходимо использовать CountVectorizer

Вот воспроизводимый пример:

df = pd.DataFrame([[['kubernetes', 'client', 'bootstrapping', 'ponda']], [['micro', 'insu']], [['motor', 'upi']],[['secure', 'app', 'installation']],[['health', 'insu', 'express', 'credit', 'customer']],[['secure', 'app', 'installation']],[['aap', 'insta']],[['loan', 'house', 'loan', 'customers']]])

df.columns = ['new']

Я называю ваш столбец со списком слов как new, например, как он изначально находится в вашем DataFrame.

df['string'] = ""

Я создаю пустой столбец, в котором я объединю каждое слово в этом списке слов.

for i in df.index:

    df.at[i, 'string'] = " ".join(item for item in df.at[i, 'new'])

Я сканировал по строкам, объединял каждый элемент в списке строк с " " и добавлял его в столбец string.

df.drop(['new'], axis = 1, inplace = True)

Теперь столбец со списком строк не нужен! так что я бросаю его.

ТЕПЕРЬ ваш DataFrame готов так, как вы этого хотите! Теперь вы можете использовать CountVectorizer!

from sklearn.feature_extraction.text import CountVectorizer

countvec = CountVectorizer()

counts = countvec.fit_transform(df['string'])

vocab = pd.DataFrame(counts.toarray())
vocab.columns = countvec.get_feature_names()

print(vocab)

Придает

   aap  app  bootstrapping  client  credit  customer  customers  express  \
0    0    0              1       1       0         0          0        0   
1    0    0              0       0       0         0          0        0   
2    0    0              0       0       0         0          0        0   
3    0    1              0       0       0         0          0        0   
4    0    0              0       0       1         1          0        1   
5    0    1              0       0       0         0          0        0   
6    1    0              0       0       0         0          0        0   
7    0    0              0       0       0         0          1        0   

   health  house  insta  installation  insu  kubernetes  loan  micro  motor  \
0       0      0      0             0     0           1     0      0      0   
1       0      0      0             0     1           0     0      1      0   
2       0      0      0             0     0           0     0      0      1   
3       0      0      0             1     0           0     0      0      0   
4       1      0      0             0     1           0     0      0      0   
5       0      0      0             1     0           0     0      0      0   
6       0      0      1             0     0           0     0      0      0   
7       0      1      0             0     0           0     2      0      0   

   ponda  secure  upi  
0      1       0    0  
1      0       0    0  
2      0       0    1  
3      0       1    0  
4      0       0    0  
5      0       1    0  
6      0       0    0  
7      0       0    0  
0 голосов
/ 28 июня 2018

Если значения являются списками, сначала join их вместе, а затем используйте CountVectorizer:

print (type(df.loc[0, 'new']))
<class 'list'>

from sklearn.feature_extraction.text import CountVectorizer

countvec = CountVectorizer()
counts = countvec.fit_transform(df['new'].str.join(' '))
df = pd.DataFrame(counts.toarray(), columns=countvec.get_feature_names())

Другое решение для панд с get_dummies и sum:

df1 = pd.DataFrame(df['new'].values.tolist())
df = pd.get_dummies(df1, prefix='', prefix_sep='').sum(axis=1, level=0)

print (df)

   aap  app  bootstrapping  client  credit  customer  customers  express  \
0    0    0              1       1       0         0          0        0   
1    0    0              0       0       0         0          0        0   
2    0    0              0       0       0         0          0        0   
3    0    1              0       0       0         0          0        0   
4    0    0              0       0       1         1          0        1   
5    0    1              0       0       0         0          0        0   
6    1    0              0       0       0         0          0        0   
7    0    0              0       0       0         0          1        0   

   health  house  insta  installation  insu  kubernetes  loan  micro  motor  \
0       0      0      0             0     0           1     0      0      0   
1       0      0      0             0     1           0     0      1      0   
2       0      0      0             0     0           0     0      0      1   
3       0      0      0             1     0           0     0      0      0   
4       1      0      0             0     1           0     0      0      0   
5       0      0      0             1     0           0     0      0      0   
6       0      0      1             0     0           0     0      0      0   
7       0      1      0             0     0           0     2      0      0   

   ponda  secure  upi  
0      1       0    0  
1      0       0    0  
2      0       0    1  
3      0       1    0  
4      0       0    0  
5      0       1    0  
6      0       0    0  
7      0       0    0  
...