#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть матрица, полученная с помощью pandas.dataframe таким образом:
tfidf = TfidfVectorizer()
x = tfidf.fit_transform(corpus)
df_tfidf = pd.DataFrame(x.toarray(),columns=tfidf.get_feature_names())
Похоже, что матрица ниже:
В моей матрице больше столбцов и больше строк. В нем 7180 строк и 10390 столбцов. Есть ли способ напечатать заголовок col и его значение, если это значение больше 0? что-то вроде этого and: 0.511859, document: 0.46,0.68 ..
Я пытался таким образом, но это заняло много времени:
for col in df_tfidf.columns:
for row in df_tfidf.index:
if df_tfidf[col][row] > 0:
print str(df_tfidf[col][row]) ' ' col.encode('utf8')
Есть ли способ сделать это быстрее?
Комментарии:
1. Каков ваш ожидаемый результат?
2. я хочу повторить матрицу, чтобы получить только слово и его значение tfidf. Но это к большому
3. Под
tfidf
значениями вы подразумеваете положительные значения для каждого столбца, верно? И вам нужно сохранить эти значения, возможно, в каком-то словаре или вы просто хотите их распечатать?4. да, все они имеют положительное значение. Я хочу сохранить это в своего рода словаре
word: value
. Я пытаюсь поработать над ответом, данным Крисом
Ответ №1:
Вы можете использовать логическую маскировку с помощью numpy array для фильтрации положительных значений внутри dict
понимания:
r = {c: s[s > 0] for c, s in zip(df, df.T.to_numpy())}
РЕДАКТИРОВАТЬ: DataFrame.to_numpy()
доступно в версии pandas >= 0.24
, если вы используете версию pandas ниже 0.24
, тогда используйте:
r = {c: s[s > 0] for c, s in zip(df, df.T.values)}
Пример:
# Sample dataframe
col0 col1 col2
0 0.392938 -0.427721 -0.546297
1 0.102630 0.438938 -0.153787
2 0.961528 0.369659 -0.038136
3 -0.215765 -0.313644 0.458099
4 -0.122856 -0.880644 -0.203911
# Result
{'col0': array([0.39293837, 0.10262954, 0.9615284 ]),
'col1': array([0.43893794, 0.36965948]),
'col2': array([0.45809941])}
Комментарии:
1. Я пробовал использовать ваш метод, но я получаю
DataFrame' object has no attribute 'to_numpy'
2. @Lx2pwn Какая у вас версия pandas? Если меньше, чем
0.24
, то вы можете заменитьto_numpy()
наvalues
..3. это 0.22.0 на python 2.7
4.
to_numpy()
введено в версии pandas0.24
.. Попробуйте с.values
5. он отлично работает с r = {c: s[s > 0] для c, s в zip (df, df.T.значения)} за 13 секунд с матрицей фреймов данных 7180 x 10390.
Ответ №2:
data = [[0.85, 0.0], [0.2, 0.7], [0.0, 14]]
df = pd.DataFrame(data, columns = ['and', 'document'])
output = df.apply(lambda x: list(x.dropna())).to_dict()
for k,v in output.items():
print(f'{k}: {v}')
Вывод
and: [0.85, 0.2]
document: [0.7, 14.0]
Комментарии:
1. ваш метод работает. Мне нужно немного изменить цикл таким образом,
for word, dict in output.items(): for (dict, values) in dict.items(): if values > 0: print str(values) ' ' str(word.encode('utf8'))
чтобы он работал, но это занимает много времени. 8 минут