You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将分组生成的字典转换为DataFrame并导出Excel时出现维度错误的解决求助

将分组生成的字典转换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:03:09