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



是否有一种统一的方法来梳理python中.mat文件的字段名,并提取相应的数据,而不管它们的格式如何?

这些.mat文件包括:

1Xn结构
  • 1x1结构的1Xn单元阵列(具有相同的字段名称(
  • 1Xn结构的嵌套结构不一致
  • 其中我不一定知道n,但我知道n在提取的变量(字段名(之间是一致的

    我想创建一个函数,该函数使用m个字段名和.mat文件路径,并返回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
    

    此代码仅适用于列出的前两种垫子文件类型。有没有一种方法我可以在这里使用,我不必为嵌套结构或单元数组的每个可能层写一个新的if语句?

    我为自己制作了一个python包。希望其他遇到这个问题的人也能使用它。

    最新更新