将python Dataframe转换为Matlab文件

问题描述 投票:1回答:2

我试图将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文档将我的数据帧转换为列表字典正是应该做的。

python matlab dictionary dataframe tuples
2个回答
2
投票

我相信以前的解决方案没有对你有用的原因是你的DataFrame列名称不是有效的MATLAB struct字段名称,因为它们包含空格和/或以数字字符开头。

当我做:

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")})

MATLAB中的结果是一个包含4个字段reltimedatetimeiSensorquality的结构。其中每个都有1000个元素,因此这些列中的数据已经转换,但其余数据都丢失了。

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

truncDataFrame.rename(columns=lambda x:'col_' + x.replace(' ', '_'), inplace=True)  
scipy.io.savemat('EEGdata2.mat', {'struct2':truncDataFrame.to_dict("list")})

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

(请注意,在您的问题中,您正在创建一个包含名为.mat的变量的struct文件,当它加载到MATLAB中时,它会掩盖内置的struct数据类型 - 这可能也会导致后续MATLAB代码出现问题。)


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读取,因为它就在我身边。

© www.soinside.com 2019 - 2024. All rights reserved.