В настоящее время, в версии 0.23, панды реализовали редкие версии Series и Data-Frames.По совпадению ваши данные можно рассматривать как Серии с многоуровневым индексом, так что вы можете использовать этот факт для построения разреженной матрицы.Кроме того, если он согласован, ваш формат можно прочитать, используя несколько строк панд, например:
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())
Вывод
(0, 0) 0.85
(1, 0) 0.21
(2, 1) -0.831
(3, 1) 0.12300000000000001
(4, 0) 0.9229999999999999
Метод to_coo возвращает не только матрицу, но также столбцы и метки строк, следовательно, делает также обратное отображение.В приведенном выше примере возвращается следующее:
['ef', 'kl', 'lion', 'plax', 'xyz']
['abc', 'cldex']
Где 'ef'
соответствует индексу 0
строк, а 'abc'
соответствует индексу 0
столбцов.