使用scipy.io将python pandas dataframe改为matlab struct

时间:2015-06-05 14:30:27

标签: python matlab pandas

我正在尝试使用scipy.io将pandas数据帧保存到matlab .mat文件中。

我有以下内容:

array1 = np.array([1,2,3])
array2 = np.array(['a','b','c'])
array3 = np.array([1.01,2.02,3.03])
df = DataFrame({1:array1, 2:array2,3:array3}, index=('array1','array2','array3'))
recarray_ = df.to_records()
## Produces:
# rec.array([('array1', 1, 'a', 1.01), ('array2', 2, 'b', 2.02),
#   ('array3', 3, 'c', 3.03)], 
#  dtype=[('index', 'O'), ('1', '<i4'), ('2', 'O'), ('3', '<f8')])
scipy.io.savemat('test_recarray_struct.mat', {'struct':df.to_records()})

在Matlab中,我希望这会产生一个包含三个数组(一个int,一个char,一个float)的结构,但实际上它产生的是一个包含3个结构的结构,每个结构包含4个变量; 'index',1,'2',3。当试图选择1,'2'或3时,我得到错误'变量struct(1,1)。#不存在。'

任何人都可以解释预期的行为以及如何最好地将DataFrame保存到.mat文件吗?

2 个答案:

答案 0 :(得分:3)

我在此期间使用以下解决方法。如果您有更好的解决方案,请与我们联系:

a_dict = {col_name : df[col_name].values for col_name in df.columns.values}

## optional if you want to save the index as an array as well:
# a_dict[df.index.name] = df.index.values
scipy.io.savemat('test_struct_to_mat.mat', {'struct':a_dict})

答案 1 :(得分:1)

我认为您需要的是创建这样的数据框:

df = DataFrame({'array1':array1, 'array2':array2,'array3':array3})

并保存如下:

scipy.io.savemat('test_recarray_struct.mat', {'struct':df.to_dict("list")})

所以代码应该是这样的:

# ... import appropritely
array1 = np.array([1,2,3])
array2 = np.array(['a','b','c'])
array3 = np.array([1.01,2.02,3.03])
df = DataFrame({'array1':array1, 'array2':array2,'array3':array3})
scipy.io.savemat('test_recarray_struct.mat', {'struct':df.to_dict("list")})