2017-05-04 72 views
4

是否有任何簡單的方法將DataFrame方法to_latex()生成的Latex表讀回另一個DataFrame中?特別是,我正在尋找處理Multiindex的東西。舉例來說,如果我們有如下的文件「test.out」:將Latex表讀入Pandas DataFrame

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

有沒有辦法做到這一點?

回答

3

astropy模塊有一個LaTeX表格閱讀器。但它不支持所有的LaTeX表達式。我必須刪除\ toprule,\ midrule和\ bottomrule。這對我行得通。

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

enter image description here

+0

@skd歡迎您! – manelfp

1

而不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 

有了這個,你可以使用熊貓fillna方法和0設置列2爲您的多指標:

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