窗格读取多索引数据帧(反向to_string())

时间:2019-03-06 13:13:56

标签: pandas

我有一个文本文件,如下所示:

test2.dat:

               col1      col2
idx1 idx2                    
a    0     0.256788  0.862771
     1     0.409944  0.785159
     2     0.822773  0.955309
b    0     0.159213  0.628662
     1     0.463844  0.667742
     2     0.292325  0.768051

通过file.write(df.to_sring)保存多索引熊猫DataFrame创建的。 现在,我想撤销此操作。但是当我尝试

pandas.read_csv(data, sep=r'\s+', index_col=[0, 1])

它引发错误ParserError: Error tokenizing data. C error: Expected 2 fields in line 3, saw 4

这是一个小型MWE:

import pandas
import numpy as np
from itertools import product
df1 = pandas.DataFrame(product(['a', 'b'], range(3)), columns=['idx1', 'idx2'])
df2 = pandas.DataFrame(np.random.rand(6, 2), columns=['col1', 'col2'])
df  = pandas.concat([df1, df2], axis=1)
df.set_index(['idx1','idx2'], inplace=True)
df.to_csv('test.dat', sep=' ')
with open('test2.dat', 'w') as file:
    file.write(df.to_string())

请注意,与test.dat相比,通过pandas.to_csv()保存的test2.dat几乎不能算作“人类可读”

test.dat:

idx1 idx2 col1 col2
a 0 0.2567883353169065 0.862770538437793
a 1 0.40994403619942743 0.7851591115509821
a 2 0.8227727216889246 0.9553088749178045
b 0 0.1592133339255788 0.6286622783546136
b 1 0.4638439474864856 0.6677423709343185
b 2 0.2923252978245071 0.7680513714069206

2 个答案:

答案 0 :(得分:2)

使用read_fwf并通过列表理解设置列名称:

<BrowserRouter>
    <Switch>
        <PrivateRoute exact path="/wallet/portfolio"  component={AppPortfolio}  isSignedIn={isLoggedIn}/>
                    /*all other private routes here*/
        { isLoggedIn ? <Redirect to="/wallet/portfolio"/> : "" }
        <Route exact path="/wallet/login" component={AppLogin} />
        <Route exact path="/wallet/register" component={AppRegister} />
        <Redirect to={isLoggedIn ? "/wallet/portfolio" : "/wallet/login"}/>
    </Switch>
</BrowserRouter>

答案 1 :(得分:0)

我决定使用jezrael的代码略有变化,该代码会自动处理索引的数量。 请注意,df.columns最初的格式为[(x1,y1), (x2,y2), ..., (xn, yn)],其中n是列数,xi是第一个标头中列i的标签行,而yi是第二个标题行之一。

df = pandas.read_fwf(f, header=[0,1])
cols = [x for x,_ in df.columns if 'Unnamed' not in x]
idxs = [y for _,y in df.columns if 'Unnamed' not in y]
df.columns = idxs + cols
df[idxs] = df[idxs].ffill()
df.set_index(idxs, inplace=True)