У меня есть следующая структура панд:

col1 col2 col3 text
1    1    0    meaningful text
5    9    7    trees
7    8    2    text

Я хотел бы векторизовать его с помощью векторизатора tfidf. Это, однако, возвращает матрицу разбора, которую я могу фактически превратить в плотную матрицу через mysparsematrix).toarray(). Тем не менее, как я могу добавить эту информацию с метками к моей оригинальной DF? Таким образом, цель будет выглядеть так:

col1 col2 col3 meaningful text trees
1    1    0    1          1    0
5    9    7    0          0    1
7    8    2    0          1    0

ОБНОВИТЬ:

Решение делает объединение неправильным даже при переименовании исходных столбцов: введите описание изображения здесь Удаление столбцов, по крайней мере, с одним NaN приводит к тому, что осталось всего 7 строк, хотя я использую fillna(0) перед началом работы с ним.

6
lte__ 30 Авг 2017 в 16:26

3 ответа

Лучший ответ

Вы можете действовать следующим образом:

Загрузить данные в фрейм данных:

import pandas as pd

df = pd.read_table("/tmp/test.csv", sep="\s+")
print(df)

Выход:

   col1  col2  col3             text
0     1     1     0  meaningful text
1     5     9     7            trees
2     7     8     2             text

Токенизируйте столбец text, используя: sklearn.feature_extraction.text.TfidfVectorizer

from sklearn.feature_extraction.text import TfidfVectorizer

v = TfidfVectorizer()
x = v.fit_transform(df['text'])

Преобразуйте токенизированные данные в фрейм данных.

df1 = pd.DataFrame(x.toarray(), columns=v.get_feature_names())
print(df1)

Выход:

   meaningful      text  trees
0    0.795961  0.605349    0.0
1    0.000000  0.000000    1.0
2    0.000000  1.000000    0.0

Соедините фрейм данных токенизации с исходным:

res = pd.concat([df, df1], axis=1)
print(res)

Выход:

   col1  col2  col3             text  meaningful      text  trees
0     1     1     0  meaningful text    0.795961  0.605349    0.0
1     5     9     7            trees    0.000000  0.000000    1.0
2     7     8     2             text    0.000000  1.000000    0.0

Если вы хотите удалить столбец text, вам нужно сделать это перед объединением:

df.drop('text', axis=1, inplace=True)
res = pd.concat([df, df1], axis=1)
print(res)

Выход:

   col1  col2  col3  meaningful      text  trees
0     1     1     0    0.795961  0.605349    0.0
1     5     9     7    0.000000  0.000000    1.0
2     7     8     2    0.000000  1.000000    0.0

Вот полный код:

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

df = pd.read_table("/tmp/test.csv", sep="\s+")
v = TfidfVectorizer()
x = v.fit_transform(df['text'])

df1 = pd.DataFrame(x.toarray(), columns=v.get_feature_names())
df.drop('text', axis=1, inplace=True)
res = pd.concat([df, df1], axis=1)
16
Mohamed Ali JAMAOUI 23 Янв 2019 в 07:05

Вы можете попробовать следующее -

import numpy as np 
import pandas as pd 
from sklearn.feature_extraction.text import TfidfVectorizer

# create some data
col1 = np.asarray(np.random.choice(10,size=(10)))
col2 = np.asarray(np.random.choice(10,size=(10)))
col3 = np.asarray(np.random.choice(10,size=(10)))
text = ['Some models allow for specialized',
         'efficient parameter search strategies,',
         'outlined below. Two generic approaches',
         'to sampling search candidates are ',
         'provided in scikit-learn: for given values,',
         'GridSearchCV exhaustively considers all',
         'parameter combinations, while RandomizedSearchCV',
         'can sample a given number of candidates',
         ' from a parameter space with a specified distribution.',
         ' After describing these tools we detail best practice applicable to both approaches.']

# create a dataframe from the the created data
df = pd.DataFrame([col1,col2,col3,text]).T
# set column names
df.columns=['col1','col2','col3','text']

tfidf_vec = TfidfVectorizer()
tfidf_dense = tfidf_vec.fit_transform(df['text']).todense()
new_cols = tfidf_vec.get_feature_names()

# remove the text column as the word 'text' may exist in the words and you'll get an error
df = df.drop('text',axis=1)
# join the tfidf values to the existing dataframe
df = df.join(pd.DataFrame(tfidf_dense, columns=new_cols))
1
Clock Slave 30 Авг 2017 в 14:03

Привет @ lte__ Решение, предоставленное @Mohamed Ali JAMAOUI, является правильным. Однако при объединении убедитесь, что бот-набор данных имеет тот же индекс.

Если один из наборов данных не имеет такой же индекс, как у вас, вы получите возможные NaN и ошибочные данные. Чтобы исправить это: Используйте: data.reset_index(drop=True)

0
Shubham Bajaj 11 Окт 2019 в 13:31