有没有简单的方法来读取由DataFrame方法to_latex()生成的Latex表,返回另一个DataFrame?。特别是,我正在寻找处理Multiindex的东西。例如,如果我们有以下文件'test.out':
\begin{tabular}{llllrrr}
\toprule
& & & 1 & 2 & 3 \\
\midrule
a & 1 & 1.0 & 1898 & 1681 & 1.129090 \\
& & 0.1 & 1898 & 1349 & 1.406968 \\
& 10 & 1.0 & 8965 & 5193 & 1.726362 \\
& & 0.1 & 8965 & 1669 & 5.371480 \\
& 100 & 1.0 & 47162 & 22049 & 2.138963 \\
& & 0.1 & 47162 & 5732 & 8.227844 \\
b & 1 & 1.0 & 8316 & 7200 & 1.155000 \\
& & 0.1 & 8316 & 5458 & 1.523635 \\
& 10 & 1.0 & 43727 & 24654 & 1.773627 \\
& & 0.1 & 43727 & 6945 & 6.296184 \\
& 100 & 1.0 & 284637 & 137391 & 2.071730 \\
& & 0.1 & 284637 & 26364 & 10.796427 \\
\bottomrule
\end{tabular}
我的第一次尝试是将其视为
df = pd.read_csv('test.out',
sep='&',
header=None,
index_col=(0,1,2),
skiprows=4,
skipfooter=3,
engine='python')
由于read_csv()
将空字段作为Multiindex的新级别获取,因此无法正常工作:
In [4]: df.index
Out[4]:
MultiIndex(levels=[[u' ', u'a ', u'b '], [u' ', u' 1
', u' 10 ', u' 100 '], [0.1, 1.0]],
labels=[[1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0], [1, 0, 2, 0, 3, 0, 1,
0, 2, 0, 3, 0], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]],
names=[0, 1, 2])
有没有办法做到这一点?
答案 0 :(得分:4)
astropy模块有一个LaTeX表读取器。但它不支持所有LaTeX表达式。我不得不删除\ toprule,\ midrule和\ bottomrule。这对我有用。
from astropy.table import Table
tab = Table.read('table.tex').to_pandas()
答案 1 :(得分:1)
没有熵的稍微复杂的解决方案如下:
在不设置索引的情况下读入数据框:
df = pd.read_csv('table.tex',
sep='&',
header=None,
skiprows=4,
skipfooter=3,
engine='python')
现在从"空"中删除变量空格。前两列的行并将其设置为np.nan
:
df.loc[df.loc[:,0].str.strip() == "", 0] = np.nan
df.loc[df.loc[:,1].str.strip() == "", 1] = np.nan
有了这个,你可以使用熊猫' fillna
方法并将列0到2设置为多索引:
df = df.fillna(method='ffill', axis=0).set_index([0,1,2])