如何将含多参与者struct的Matlab .mat文件转为Python DataFrame?
将Matlab多参与者Struct转换为Python DataFrame
步骤说明
你加载的data是一个1×17的numpy结构化数组,每个元素对应一名参与者的完整数据。要转换成DataFrame,核心是把每个参与者的字段提取为字典,再批量转换为DataFrame。以下是具体实现:
完整代码
from scipy.io import loadmat import pandas as pd import numpy as np # 加载数据(你的原有代码) matlabData = loadmat(r"\\LPS_IMU_Struct060621_Done.mat") data = matlabData['LPS_Struct'] # 把1×17的数组展平为一维,方便遍历所有参与者 participants = data.flatten() # 初始化列表存储每个参与者的字典数据 participant_data = [] for idx, participant in enumerate(participants): # 创建当前参与者的数据字典 p_dict = {"Participant_ID": idx + 1} # 可选:添加参与者编号 # 遍历所有字段(对应dtype里的Name、Table等) for field_name in data.dtype.names: # 提取字段值:loadmat加载的struct字段是嵌套的(1,1) object,需要[0][0]取出实际内容 field_value = participant[field_name][0][0] # 处理不同类型的字段: if isinstance(field_value, np.ndarray): # 如果是Matlab Table(结构化数组),直接转成子DataFrame if field_value.dtype.names is not None: p_dict[field_name] = pd.DataFrame(field_value) # 如果是普通数值数组,转成列表存在DataFrame中(避免嵌套数组的存储问题) else: p_dict[field_name] = field_value.tolist() # 字符串/其他基础类型直接保留 else: p_dict[field_name] = field_value participant_data.append(p_dict) # 转换为最终的DataFrame final_df = pd.DataFrame(participant_data)
关键细节解释
- 展平数组:
data.flatten()把原来的(1,17)二维数组转成一维,遍历起来更直观。 - 字段提取:Matlab struct通过
loadmat加载后,每个字段都是(1,1)的object类型,必须用[0][0]才能取出实际数据(比如字符串、数组或Table)。 - 类型适配:
- Matlab的Table会被加载为numpy结构化数组,直接用
pd.DataFrame()转换为子DataFrame,保留原表格结构。 - 数值数组转成列表存储,避免DataFrame中嵌套numpy数组可能带来的操作问题。
- Matlab的Table会被加载为numpy结构化数组,直接用
- 参与者编号:可选添加
Participant_ID列,方便后续按参与者筛选分析。
后续调整建议
- 如果某个数组字段(比如
Array)需要展开为多列,可以在遍历字段时单独处理,比如用pd.DataFrame(field_value)后拼接成主DataFrame的列。 - 如果字符串出现编码问题,可以尝试用
str(field_value)强制转换为Python字符串。
内容的提问来源于stack exchange,提问作者Cmagelssen
相关产品推荐
相关产品推荐

