在python中从dataframe矩阵打印标题值
我通过pandas.dataframe获得了一个矩阵:在python中从dataframe矩阵打印标题值,python,pandas,dataframe,Python,Pandas,Dataframe,我通过pandas.dataframe获得了一个矩阵: tfidf = TfidfVectorizer() x = tfidf.fit_transform(corpus) df_tfidf = pd.DataFrame(x.toarray(),columns=tfidf.get_feature_names()) 它看起来像下面的矩阵: 我的矩阵有更多的列和行。它有7180行和10390列。是否有一种方法可以打印列的标题,其值是否大于0?有人这样想和:0.511859,文档:0.46,0.68
tfidf = TfidfVectorizer()
x = tfidf.fit_transform(corpus)
df_tfidf = pd.DataFrame(x.toarray(),columns=tfidf.get_feature_names())
它看起来像下面的矩阵:
我的矩阵有更多的列和行。它有7180行和10390列。是否有一种方法可以打印列的标题,其值是否大于0?有人这样想和:0.511859,文档: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')
有没有办法更快地做到这一点
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]
您可以使用带numpy数组的布尔掩蔽来过滤dict
comprehension中的正值:
r = {c: s[s > 0] for c, s in zip(df, df.T.to_numpy())}
编辑:DataFrame.to_numpy()
在pandas版本>=0.24
中可用,如果您使用的是低于0.24
的pandas版本,请使用:
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])}
您期望的输出是什么?我想迭代矩阵以获得单词及其tfidf值。但它是指每列的正数,对吗?你需要把这些值存储在字典里还是只想打印出来?是的,它们都是正值。我想把它保存在一种字典中
word:value
。我正在努力研究chrisI给出的答案,我尝试了你的方法,但我得到的DataFrame'对象没有属性“to\u numpy”
@Lx2pwn你的熊猫版本是什么?如果低于0.24
,则可以用值替换to_numpy()
。在Python2.7上为0.22.0to_numpy()
是在pandas版本0.24
中引入的。尝试使用值
它可以与r={c:s[s>0]完美配合使用,s在zip中(df,df.T.values)}使用数据帧矩阵7180 x 10390,在13秒内完成。您的方法有效。我需要以这种方式修改循环for word,dict in output.items():for(dict,values)in dict.items():如果值>0:print str(values)+''+str(word.encode('utf8'))
它可以工作,但需要很多时间。8分钟