Python ValueError求助:DataFrame列名赋值轴元素数不匹配
错误原因
报错ValueError: Length mismatch: Expected axis has 0 elements, new values have 4 elements说明你创建的final_clust是空DataFrame(没有任何行和列),但你试图给它赋值4个列名,两者长度不匹配。本质原因是products、clusters、facs、demand这四个列表中至少有一个为空,或者四个列表长度不一致,导致zip()后没有生成有效数据,最终DataFrame无内容。
从你提供的代码看,缩进错误是核心问题:products.append()和clusters.append()的缩进比demand.append()更深,这会导致这两行代码要么无法被正常执行(甚至触发语法错误),要么仅在某个不存在的代码块内执行,最终导致products和clusters列表为空,zip()后无有效数据。
修复步骤与代码优化
1. 修正缩进错误
将products.append()、clusters.append()的缩进调整到和demand.append()、facs.append()同一级别,确保每次循环都执行这四个列表的追加操作。
2. 处理空数据场景
原代码中demand.append()直接通过int()转换查询结果,如果查询不到对应数据(返回空Series),会触发新的报错。需要添加空值检查,避免循环中断。
3. 新增长度校验
在创建DataFrame前,校验四个列表的长度是否一致,提前发现数据异常。
修复后的完整代码
import pandas as pd products = [] clusters = [] facs = [] demand = [] for prod in clust_df['product'].unique(): # 先获取当前产品对应的所有工厂 prod_facs = clust_df[clust_df['product'] == prod]['close_facs'] for fac in prod_facs: # 过滤需求数据,避免空Series报错 demand_filter = (agg_demand_ext_2_wh_to_wh_lookup['prod_id'] == prod) & \ (agg_demand_ext_2_wh_to_wh_lookup['chosen_fac'] == fac) demand_row = agg_demand_ext_2_wh_to_wh_lookup[demand_filter]['agg_dem_two_whs'] if demand_row.empty: print(f"提示:未找到产品{prod}、工厂{fac}的需求数据,跳过该记录") continue # 安全转换并追加数据 demand.append(int(demand_row.iloc[0])) products.append(prod) # 获取集群数据 cluster_row = clust_df[(clust_df['product'] == prod) & (clust_df['close_facs'] == fac)]['cluster'] clusters.append(int(cluster_row.iloc[0])) facs.append(fac) # 校验列表长度一致性 assert len(products) == len(clusters) == len(facs) == len(demand), "四个列表长度不一致,请检查循环逻辑" # 直接在DataFrame初始化时指定列名,避免后续赋值 final_clust = pd.DataFrame( zip(products, clusters, facs, demand), columns=['prod_id', 'clusters', 'facs', 'agg_demand_2'] )
额外调试建议
如果修复后仍出现空DataFrame问题,可在循环结束后添加以下代码,排查数据来源:
print(f"products列表长度:{len(products)}") print(f"clusters列表长度:{len(clusters)}") print(f"facs列表长度:{len(facs)}") print(f"demand列表长度:{len(demand)}") print(f"clust_df唯一产品数量:{len(clust_df['product'].unique())}")
内容的提问来源于stack exchange,提问作者Joshua Toliver

