使用pandas来编写和读取3D数据

时间:2017-12-13 18:32:12

标签: python pandas numpy

我有一个使用保存在文本文件上的3D数据的项目。我目前正在使用单个空格在第一维上拆分数据,一个换行(\ n)以拆分第二个维和两个换行符(\ n \ n)以拆分最后一个维度并使用默认读写python。使用字符串拆分和列表推导来完成对这些数据的解释。 有没有办法用pandas做到这一点?

我已经使用3D numpy数据测试了dataframe.write并得到了以下错误:ValueError:必须传递2-d输入。有可能解决这个问题吗?

2 个答案:

答案 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来增强可读性:

enter image description here

然后您可以回读:

#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数据的多重索引数据框。