Pandas DataFrame追加CSV时报错:值长度与索引长度不匹配
问题原因与解决方案
错误原因
你的代码逻辑存在问题:每次运行时读取整个CSV的现有数据,修改指定列的所有行后再追加整个DataFrame,而非追加新的单行数据。具体过程:
- 第一次运行:初始CSV只有表头,读取后得到空DataFrame(0行),赋值
["100"]会自动扩展为1行(其他列NaN),追加后CSV有1条数据。 - 第二次运行:读取到1行的DataFrame,赋值长度1的列表刚好匹配,修改该行指定列后追加,CSV变为2条数据(实际是重复写入修改后的旧行)。
- 第三次运行:读取到2行的DataFrame,赋值长度1的列表与行数量(2)不匹配,触发
ValueError。
正确解决方案
要实现向指定列追加新行数据,无需读取整个现有数据,直接创建单行DataFrame并追加即可:
简化版代码
import pandas as pd sector_select = "Col2" # 创建仅包含指定列的单行DataFrame,其他列自动填充NaN new_row = pd.DataFrame({sector_select: ["100"]}) # 追加到CSV,不写入索引和表头 new_row.to_csv("stack.csv", index=False, mode='a', header=False)
严谨版代码(确保列数与原CSV一致)
如果需要严格匹配原CSV的所有列(避免列错位),可以明确指定所有列:
import pandas as pd # 原CSV的所有列名 columns = ["Col1", "Col2", "Col3", "Col4", "Col5"] sector_select = "Col2" # 初始化所有列为空值,仅给指定列赋值 new_row = pd.DataFrame({col: [None] for col in columns}) new_row[sector_select] = ["100"] # 追加到CSV new_row.to_csv("stack.csv", index=False, mode='a', header=False)
每次运行以上代码,都会向CSV末尾追加一行新数据,仅指定列有值,其他列留空,不会出现长度不匹配的错误。
内容的提问来源于stack exchange,提问作者pythonic
相关产品推荐
相关产品推荐

