擅长:python、mysql、java
<p>目前,在0.23版本中,pandas已经实现了序列和数据帧的稀疏版本。巧合的是,您的数据可以看作是一个具有多级索引的序列,因此您可以利用这个事实来构建稀疏矩阵。此外,如果格式一致,可以使用几行panda来读取格式,例如:</p>
<pre><code>import numpy as np
import pandas as pd
from io import StringIO
lines = StringIO("""abc
ef 0.85
kl 0.21
xyz 0.923
cldex
plax 0.123
lion -0.831""")
# load Series
s = pd.read_csv(lines, delim_whitespace=True, header=None, names=['k', 'v'])
s = s.assign(k2=pd.Series(np.where(np.isnan(s.v), s.k, np.nan)).ffill())
result = s[~np.isnan(s.v)].set_index(['k2', 'k']).squeeze()
# convert to sparse matrix (csr)
ss = result.to_sparse()
coo, rows, columns = ss.to_coo(row_levels=['k'], column_levels=['k2'], sort_labels=True)
print(coo.tocsr())
</code></pre>
<p><strong>输出</strong></p>
^{pr2}$
<p><a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.SparseSeries.to_coo.html" rel="nofollow noreferrer">to_coo</a>方法不仅返回矩阵,还返回列和行标签,因此还执行逆映射。在上面的示例中,返回以下内容:</p>
<pre><code>['ef', 'kl', 'lion', 'plax', 'xyz']
['abc', 'cldex']
</code></pre>
<p>其中<code>'ef'</code>对应于行的索引<code>0</code>,而{<cd3>}对应于列的索引<code>0</code>。在</p>