【问题标题】:Converting python Dataframe to Matlab file将python Dataframe转换为Matlab文件
【发布时间】:2018-08-02 13:10:45
【问题描述】:

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

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

MyDataFrame = pd.read_csv("data.txt",sep=';',decimal='.'),data.txt 是一个带有标签的二维数组。这将创建一个看起来像 this 的数据框。

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

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

它确实创建了一个 .mat 文件,但它没有正确保存我的数据框。我得到的文件看起来像this,所以所有的值基本上都没有了,你看到的剩下的标签都是空的。

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

【问题讨论】:

  • 这看起来是一个有用的贡献,但你能把它改写成一个问题,然后提供你的答案作为答案吗?此外,查看一些示例数据可能会有所帮助。
  • 当然,今晚我回家后会这样做。
  • 酷。当我需要进行这种转换时,字典列表方法对我有用,但显然您的数据和/或环境有些不同。你用的是什么版本的 python、scipy 和 MATLAB?
  • 我正在使用 Python 3.6、MATLAB R2017b 和我最近(上周)安装的 anaconda 附带的 scipy 版本。它可能来自我的数据或来自最近版本的更改,老实说我不知道​​。 Here are what the first lines of my raw data look like.
  • 如果您可以以文本形式分享该数据提取,我很乐意试用它,看看我是否遇到了同样的问题,如果有,请尝试找出发生了什么。

标签: python matlab dictionary dataframe tuples


【解决方案1】:

我相信以前的解决方案对您不起作用的原因是您的 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 出现问题代码。)

【讨论】:

  • 是的,这正是我所看到的,这 4 个字段,而不是剩余的数据。空格和数字确实应该解释这种行为。我手动删除了这些字符(为了它)并且它正常工作。这是我的上级给我的文件,所以我会警告他这种格式。非常感谢您的帮助。
【解决方案2】:

感谢this post,我终于找到了解决方案。在那里,张贴者没有创建一个列表字典,而是一个整数字典,这对我有用。这是一个小例子,很容易复制。然后我尝试通过输入 [1, 2] 之类的值手动添加列表,但它不起作用。但是当我手动添加 tuples 时起作用了!

MyDataFrame 需要转换为字典,如果 lists 字典不起作用,请尝试使用 tuples

对于初学者:列表由 [] 包含,元组由 () 包含。 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 读取,因为它在我这边。

【讨论】:

  • 我假设您的 mp.savematscipy.io.savemat 相同?
  • 其实不是。就我而言,由于导出不适用于 scipy.io.savemat,因此我使用了 mat4py (0.4.0),它是专门为此类任务设计的 python 工具。它只包含两个函数:savemat 和 loadmat。
  • 这是已接受解决方案的有效替代解决方案,因为您在 MATLAB 中以这种方式获得的内容可能是一种更方便的按行访问数据的格式 - mystruct(345) 包含第 345 行的所有字段DataFrame,等等。
猜你喜欢
  • 2013-11-16
  • 2018-03-11
  • 1970-01-01
  • 2022-11-06
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 2011-11-02
  • 2020-09-03
相关资源
最近更新 更多