将分组生成的字典转换为DataFrame并导出Excel时出现维度错误的解决求助
你遇到的 ValueError: Buffer has wrong number of dimensions (expected 1, got 2) 错误,根源在于你把每个值都是二维DataFrame的字典直接转换为DataFrame时,pandas无法处理这种“单元格嵌套DataFrame”的结构,后续导出自然会触发维度不匹配的报错。
问题原因分析
你的代码中,df_pms = {query_id: grp.copy() for query_id, grp in df2.groupby("Portfolio")} 生成的是一个字典:键是Portfolio的取值,对应的值是完整的子DataFrame(二维表格结构)。当你用pd.DataFrame(data=df_pms, index=[0])转换时,得到的df3中每个单元格存储的都是一个二维DataFrame——这种嵌套结构不符合pandas导出Excel的要求,因此触发了维度错误。
针对性解决方案
根据你的代码逻辑,推测你想要的是将按Portfolio分组后的子数据集妥善导出,这里提供两种最贴合需求的实现方式:
方案1:将每个Portfolio的子数据导出到Excel的不同Sheet(推荐)
如果你的目标是让每个分组结果对应Excel的独立Sheet,不需要绕弯生成字典再转DataFrame,直接用pd.ExcelWriter循环写入即可:
import pandas as pd import numpy as np path = r"C:\zzz" xls = pd.ExcelFile(path) df1 = pd.read_excel(xls, 'CORRESPONDANCE') df2 = pd.read_excel(xls, 'OP LIST') # 原数据清洗逻辑保留 coldel = np.r_[6, 7, 11:42] df2.drop(df2.columns[coldel], inplace=True, axis=1) df2 = df2.drop(df2.index[0:7]) df2.columns = df2.iloc[0] df2 = df2.sort_values(by='Portfolio', key=lambda x: x.str.split('MP')) df2 = df2.dropna(subset=["Portfolio", "Instrument Name"]) df2 = df2[df2.Portfolio != "Portfolio"] filter_op_nature = ['Buy', 'Sell'] df2 = df2[df2['Op. Nature'].isin(filter_op_nature)] # 直接分组后导出到不同Sheet with pd.ExcelWriter("output.xlsx") as writer: for portfolio_name, group_df in df2.groupby("Portfolio"): # 重置子数据集的索引,让导出的表格更整洁 group_df = group_df.reset_index(drop=True) # 将每个分组写入独立Sheet,Sheet名用Portfolio名称 group_df.to_excel(writer, sheet_name=portfolio_name, index=False)
方案2:将所有分组数据合并为一个结构正确的平级DataFrame
如果你只是想把分组后的整合成一个大的平级DataFrame(保留Portfolio作为标识列),完全不需要生成字典,直接用清洗后的df2即可;如果必须基于字典合并,可以用pd.concat:
# 基于df_pms字典合并为平级DataFrame df_combined = pd.concat(df_pms.values(), keys=df_pms.keys(), names=["Portfolio", "Sub_Index"]) # 重置索引让结构更清晰 df_combined = df_combined.reset_index(level=1, drop=True).reset_index() # 导出到Excel df_combined.to_excel("output.xlsx", index=False)
补充:原代码错误的核心原因
再回头看你原代码的问题点:
df3 = pd.DataFrame(data=df_pms, index=[0]) df3 = df3.T
转置后的df3,每一行的元素都是一个二维DataFrame——pandas在导出Excel时无法序列化这种嵌套的二维结构,因此抛出维度错误。只有当DataFrame的单元格是标量、一维列表/数组时,才能正常完成导出操作。
备注:内容来源于stack exchange,提问作者moqa

