从不一致的 MATLAB 数据格式中提取数据字段到 pandas 数据帧
Extract data fields from inconsistent MATLAB data formats into pandas dataframe
是否有一种统一的方式来梳理.mat文件在python中的字段名称并提取相应的数据而不考虑其格式?
这些 .mat 文件包括:
- 1Xn 结构
- 1x1 结构的 1Xn 元胞数组(具有相同的字段名称)
- 1Xn 结构的不一致嵌套结构
我不一定知道 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 为我做的。希望遇到这个问题的其他人也可以使用它。
是否有一种统一的方式来梳理.mat文件在python中的字段名称并提取相应的数据而不考虑其格式?
这些 .mat 文件包括:
- 1Xn 结构
- 1x1 结构的 1Xn 元胞数组(具有相同的字段名称)
- 1Xn 结构的不一致嵌套结构
我不一定知道 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 为我做的。希望遇到这个问题的其他人也可以使用它。