我有一个文本文件,它看起来像这样:
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_string)
保存一个多索引pandas DataFrame创建了这个。
现在,我想要反转这个操作。但是,当我尝试时
Original Answer:"最初的回答"
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())
注意,通过
pandas.to_csv()
保存的test.dat
与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
file.write(df.to_string())
将完全相同的DataFrame保存而来的。之所以这样做,是因为我想以人类可读的形式保存数据。很遗憾的是,当使用多级索引时,pandas没有提供to_string
的反向功能。 - Hyperplanedf = df.to_csv(file)
,直接使用read_csv
就可以了。 - jezraeldf.to_string()
创建的文件不存在。 - jezraelto_csv
对我来说并不是很好用,因为输出结果并不容易阅读(尤其是与to_string
的输出相比)。不管怎样,感谢你的帮助! - Hyperplane