将python Dataframe转换为Matlab文件

时间:2018-02-22 15:46:55

标签: python matlab dictionary dataframe tuples

我正在尝试将python Dataframe转换为Matlab(.mat)文件。

我最初有一个使用panda.read_csv导入的txt(EEG信号):

MyDataFrame = pd.read_csv("data.txt",sep=';',decimal='.'),data.txt是带有标签的2D数组。这会创建一个类似this的数据框。

为了将其转换为.mat,我尝试this solution,其中的想法是将数据帧转换为列表字典,但在尝试此解决方案的每个方面之后,它仍然不成功。

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

它确实创建了一个.mat文件,但它没有正确保存我的数据帧。我获得的文件看起来像this,因此所有值基本消失了,当您查看它们时,您看到的其余标签都是空的。

我也尝试使用mat4py来设计将python结构导出到Matlab文件中,但它也没有用。我不明白为什么,因为将我的数据框转换为列表字典正是根据mat4py文档应该做的事情。

2 个答案:

答案 0 :(得分:2)

我认为之前的解决方案无法为您效果的原因是您的if (newCapacity < minCapacity)列名称不是有效的MATLAB DataFrame字段名称,因为它们包含空格和/或以数字字符。

当我这样做时:

struct

MATLAB中的结果是一个包含4个字段import pandas as pd import scipy.io MyDataFrame = pd.read_csv('eeg.txt',sep=';',decimal='.') truncDataFrame = MyDataFrame[0:1000] # reduce data size for test purposes scipy.io.savemat('EEGdata1.mat', {'struct1':truncDataFrame.to_dict("list")}) reltimedatetimeiSensor的结构。其中每个都有1000个元素,因此这些列中的数据已经转换,但其余数据都丢失了。

但是,如果我首先重命名DataFrame列:

quality

MATLAB中的结果是一个包含36个字段的结构。这与mat4py解决方案的格式不同,但它确实包含(据我所知)来自源DataFrame的所有数据。

(请注意,在您的问题中,您正在创建一个包含名为truncDataFrame.rename(columns=lambda x:'col_' + x.replace(' ', '_'), inplace=True) scipy.io.savemat('EEGdata2.mat', {'struct2':truncDataFrame.to_dict("list")}) 的变量的.mat文件,当它加载到MATLAB中时,它会掩盖内置的struct数据类型 - 也会导致后续MATLAB代码出现问题。)

答案 1 :(得分:1)

我终于通过this post找到了解决方案。在那里,海报并没有创建一个列表字典,而是一个整数字典,它在我身边起作用。这是一个很容易再现的小例子。然后我尝试通过输入像[1,2]这样的值手动添加列表,但它不起作用。但是当我手动添加元组时,有用的是什么!

MyDataFrame需要转换为字典,如果列表字典无法正常工作,请尝试使用元组

对于初学者:列表由[]和元组由()包含。 Here is an image showing both

这对我有用:

import mat4py as mp
EEGdata = MyDataFrame.apply(tuple).to_dict()
mp.savemat('EEGdata.mat',{'structs': EEGdata})

EEGdata.mat现在应该可以被Matlab读取,因为它就在我身边。