将Latex表格读入Pandas DataFrame

10

有没有什么简单的方法可以将由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()将空字段视为多级索引的新层级,因此导致其无法正常工作:

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])

有没有什么方法可以实现这个?
2个回答

11

astropy模块有一个LaTeX表格阅读器。但它不支持所有的LaTeX表达式。我不得不删除\toprule、\midrule和\bottomrule。这对我来说是可行的。

from astropy.table import Table
tab = Table.read('table.tex').to_pandas()

输入图像描述


2
一个稍微复杂一些的解决方案,没有使用astropy,可以按照以下步骤进行:
读取数据框,但不要设置索引:
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

通过这个方法,您可以使用pandas的fillna方法,并将列0到2设置为您的多索引:

df = df.fillna(method='ffill', axis=0).set_index([0,1,2])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接