pandas创建DataFrame报指定3列但数据列数不匹配问题排查
问题成因
pd.DataFrame() 构造函数接收可迭代对象作为输入数据时,默认将顶层可迭代对象的每个元素识别为一行数据,而非一列数据。function()返回值是包含3个列表的元组,直接将这个元组传入构造函数时,pandas会判定输入为3行数据,且每行仅包含1个元素(即对应的完整列表),但columns参数传入了3个列名,要求每行有3个元素和列名一一对应,数据维度和列数不匹配,因此触发报错。
注:原示例代码中b、c的列表推导式直接引用了外层未定义的title变量,实际运行时需要替换为真实的摘要获取逻辑,否则会额外触发变量未定义错误。
修复方案
任选以下两种写法即可实现“每个列表单独作为一列”的需求:
- 方案1:用
zip()将三个列表按位置逐行打包,把打包后的逐行数据传入构造函数:
import pandas as pd def function(pages = 0): a = [title for title in range(pages)] # 替换为真实的summary、summary2获取逻辑 b = [[f"summary_{i}"] for i in range(pages)] c = [[f"summary2_{i}"] for i in range(pages)] return a, b, c a, b, c = function(pages=2) df = pd.DataFrame(zip(a, b, c), columns=['A', 'B', 'C'])
- 方案2:以字典形式传入数据,字典的键为列名,值为对应列的列表,这种写法可读性更强,不需要手动对齐列顺序:
a, b, c = function(pages=2) df = pd.DataFrame({ 'A': a, 'B': b, 'C': c })
运行后得到的DataFrame结构如下,三个列表会分别对应A、B、C三列:
| A | B | C |
|---|---|---|
| 0 | ['summary_0'] | ['summary2_0'] |
| 1 | ['summary_1'] | ['summary2_1'] |
内容的提问来源于stack exchange,提问作者megansorel
相关产品推荐
相关产品推荐

