从不一致的 MATLAB 数据格式中提取数据字段到 pandas 数据帧

Extract data fields from inconsistent MATLAB data formats into pandas dataframe

是否有一种统一的方式来梳理.mat文件在python中的字段名称并提取相应的数据而不考虑其格式?

这些 .mat 文件包括:

我不一定知道 n 但我知道 n 在提取的变量(字段名称)中是一致的

我想创建一个函数,它接受 m 个字段名称和一个 .mat 文件路径以及 returns 一个 nXm pandas 数据帧。

到目前为止我的代码:

import scipy.io as sio
import numpy as np
import pandas as pd

def mat2df(mat_file, var_list): 
    #mat_file is a file path and var_list is a list of strings corresponding to structure field names
    df = pd.DataFrame()
    surface_mat = sio.loadmat(mat_file)
    for i in list(surface_mat):
        if "__" not in i and "readme" not in i: #strip away top dict layer of mat file
            mat = surface_mat[i] #mat is an ndarray
            if mat.dtype.names is not None: #if mat is a 1Xn structure
                for j in mat.dtype.names:
                    if j in var_list: #if variable is named by user    
                        karray = np.reshape(np.transpose(mat[j]),(-1))
                        #append dataframe column
                        df[j] = pd.Series(karray, index=range(len(karray)),dtype=mat[j][0][0].dtype)

            elif mat[0][0].dtype.names is not None: # if mat is a 1Xn cell array of 1X1 structures
                for j in mat[0][0].dtype.names:
                    if j in var_list: #if variable is named by user
                        karray = np.array([])
                        for k in range(len(mat[0])):
                            karray = np.append(karray,mat[0][k][j][0][0])
                        #append dataframe column
                        df[j] = pd.Series(karray, index=range(len(karray)),dtype=mat[j][0][0].dtype)

            else: #Unfortunately, code format doesn't leave many options for data formatting 
                raise NotImplementedError("Current MATLAB data format not yet supported \
                    \nCurrent support covers structures and cell arrays of structures")
    return df

此代码仅涵盖列出的前 2 种 mat 文件类型。有没有我可以在这里使用的方法,我不必为嵌套结构或元胞数组的每个可能层编写新的 if 语句?

我做了一个 python package 为我做的。希望遇到这个问题的其他人也可以使用它。