Python DataFrame转换为MATLAB Table报错原因及MATLAB内直接转换方案咨询
解决MATLAB中Python DataFrame转Table的维度匹配错误
先搞懂错误到底啥意思
你碰到的这个Error using py.pandas.DataFrame/table Dimensions of the key and value must be the same, or the value must be scalar错误,说白了就是MATLAB的table()函数认不了你DataFrame里的嵌套字段。MATLAB Table要求每一列要么是长度统一的普通向量,要么是单个标量值,但你的DataFrame里有些列是1xN的嵌套对象(每个元素自己还有子字段),这种层级结构不符合MATLAB Table的列数据规则,所以直接转换就报错了。
纯MATLAB内的解决办法(不用碰Python脚本)
步骤1:加载DataFrame并拆分普通列和嵌套列
先把你的原有加载代码补全(记得关文件句柄),然后遍历每一列,区分普通数值列和嵌套对象列:
% 加载pkl文件(你的原有代码,加上关闭句柄) fid = py.open("data.pkl"); data = py.pickle.load(fid); fid.close(); % 一定要关,不然可能占用文件 % 把DataFrame的列名转成MATLAB能直接用的字符串数组 colNames = cellstr(py.list(data.columns)); % 初始化一个空的MATLAB Table matTable = table(); % 逐个处理每一列 for i = 1:length(colNames) colName = colNames{i}; pyColumn = data.(colName); % 先尝试直接转成MATLAB数组——成功就是普通列,失败就是嵌套列 try % 数值列直接转成MATLAB双精度数组 matColumn = double(pyColumn); matTable.(colName) = matColumn; catch % 嵌套列:把每个对象转成MATLAB结构体数组 structArray = struct(); % 获取第一个嵌套对象的字段名(假设所有对象结构一致) objFields = cellstr(py.list(pyColumn.iloc[0].__dict__.keys())); % 遍历每个嵌套对象,提取字段值 for j = 1:length(pyColumn) % 注意Python是0索引,MATLAB是1索引,所以j-1 currentObj = pyColumn.iloc[j-1]; for f = 1:length(objFields) fieldName = objFields{f}; % 这里假设字段是数值,要是字符串就换成string(currentObj.(fieldName)) structArray(j).(fieldName) = double(currentObj.(fieldName)); end end % 把结构体数组作为Table的一列加入 matTable.(colName) = structArray; end end
步骤2:适配特殊数据类型
如果嵌套对象里有字符串字段,把上面的double()换成string()或者char()就行,比如:
structArray(j).(fieldName) = string(currentObj.(fieldName));
要是有布尔值,就用logical()转换。
步骤3:检查转换结果
转换完后,用disp(matTable)或者summary(matTable)看看结构对不对,普通列应该是数值数组,嵌套列会显示成结构体数组类型,这样后续在MATLAB里就能正常调用了。
为啥这个方法可行?
MATLAB Table其实是支持结构体数组作为列数据的,我们手动把嵌套的Python对象拆成MATLAB结构体数组,就绕开了table()函数直接转换时的维度限制,而且全程都在MATLAB里操作,完全不用额外生成.mat文件或者修改原pkl。
内容的提问来源于stack exchange,提问作者David K
相关产品推荐
相关产品推荐

