печать заголовка-значения из матрицы фреймов данных в Python

#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() введено в версии pandas 0.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 минут