簡體   English   中英

從不一致的 MATLAB 數據格式中提取數據字段到 pandas dataframe

[英]Extract data fields from inconsistent MATLAB data formats into pandas dataframe

是否有統一的方法來梳理 python 中的 .mat 文件的字段名稱並提取相應的數據,無論其格式如何?

這些.mat 文件包括:

  • 1Xn 結構
  • 1Xn 單元格 arrays 的 1x1 結構(具有相同的字段名稱)
  • 1Xn 結構的不一致嵌套結構

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

我想創建一個 function,它采用 m 字段名稱和 a.mat 文件路徑並返回 nXm pandas dataframe。

到目前為止我的代碼:

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 希望其他偶然發現這個問題的人也可以使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM