我有一个使用保存在文本文件上的3D数据的项目。我目前正在使用单个空格在第一维上拆分数据,一个换行(\ n)以拆分第二个维和两个换行符(\ n \ n)以拆分最后一个维度并使用默认读写python。使用字符串拆分和列表推导来完成对这些数据的解释。 有没有办法用pandas做到这一点?
我已经使用3D numpy数据测试了dataframe.write并得到了以下错误:ValueError:必须传递2-d输入。有可能解决这个问题吗?
答案 0 :(得分:2)
Pandas拥有一个Panel
类来管理3D数组,并将它们表示为未堆叠的数据帧。但是,某些轴转换需要在文本文件中具有正确的布局:
a=arange(27).reshape(3,3,3)
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
写作:
df=pd.Panel(np.rollaxis(a,2)).to_frame()
df.to_csv('datap.txt')
然后文本文件包含:
major,minor,0,1,2
0,0,0,1,2
0,1,3,4,5
0,2,6,7,8
1,0,9,10,11
1,1,12,13,14
1,2,15,16,17
2,0,18,19,20
2,1,21,22,23
2,2,24,25,26
您还可以使用to_html
来增强可读性:
然后您可以回读:
#read
df=pd.read_csv('datap.txt',index_col=[0,1])
a2= np.rollaxis(np.rollaxis(df.to_panel().values,2),2)
In [161]: np.allclose(a,a2)
Out[161]: True
但将来你必须使用xarray
模块。
答案 1 :(得分:0)
我不知道一个非常干净的解决方案,但手动接近它的一种方法如下:
import pandas as pd
import numpy as np
df = pd.read_csv('tmp.csv', skip_blank_lines=False)
# add a blank row at the end
df = df.reindex(np.arange(len(df.index) + 1))
# add an index of the third dimension
indices = df[df.isnull().all(1)].index
df['level'] = pd.Series(range(len(indices)), index=indices)
df['level'].fillna(method='bfill', inplace=True)
# reset indices within each "group"
df = df.groupby('level').apply(lambda x: x.reset_index())
df = df.drop(['level', 'index'], axis=1).dropna(how='all')
结果是一个表示3D数据的多重索引数据框。