我正在尝试将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文档应该做的事情。
答案 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")})
,reltime
,datetime
和iSensor
的结构。其中每个都有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读取,因为它就在我身边。