将python Dataframe转换为Matlab文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将python Dataframe转换为Matlab文件相关的知识,希望对你有一定的参考价值。
我试图将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文档将我的数据帧转换为列表字典正是应该做的。
我相信以前的解决方案没有对你有用的原因是你的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个字段reltime
,datetime
,iSensor
和quality
的结构。其中每个都有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代码出现问题。)
我终于通过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读取,因为它就在我身边。
以上是关于将python Dataframe转换为Matlab文件的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Python 列表转换为 Python Dataframe?
python 将Numpy数组转换为Pandas Dataframe
将 pandas.DataFrame 转换为 Python 中的字典列表