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

按列值拆分CSV遇ValueError:数组长度不匹配求解

解决按年份分组拆分CSV的问题

首先,咱们来拆解你遇到的核心问题:

  • 长度不匹配报错:你用einzel["PY"] == ["2015","2014",...]的时候,einzel["PY"]是一个包含489行数据的pandas Series,而右边是长度仅为5的列表,pandas无法直接对两个不同长度的序列做相等比较,所以抛出了Arrays were different lengths的错误。
  • 遍历逻辑错误:for row in einzel会遍历DataFrame的列名,而不是逐行遍历数据,这完全偏离了你想要的操作目标。
  • 未正确初始化Writer:代码里你注释掉了writer = csv.writer(out),就算没注释,每次循环重复打开文件的方式也会导致效率低下,还容易出现写入异常。

修正后的代码方案(简洁高效的pandas实现)

不用手动处理CSV写入逻辑,直接利用pandas的筛选和保存功能,代码更清晰易维护:

import pandas as pd

# 读取原始CSV文件
einzel = pd.read_csv(
    "501-1000.csv",
    sep='\t',
    header=0,
    index_col=False,
    usecols=["TI","AB","PY","DI"],
    dtype=str
)

# 定义年份分组与对应输出文件的映射关系
year_groups = {
    "a.csv": ["2015","2014","2013","2012","2011"],
    "b.csv": ["2010","2009","2008","2007","2006"],
    "c.csv": ["2005","2004","2003","2002","2001"],
    "d.csv": ["2000","1999","1998","1997","1996"],
    "e.csv": ["1995","1994","1993","1992","1991"]
}

# 遍历每个分组,筛选数据并保存
for output_file, target_years in year_groups.items():
    # 筛选PY列值在当前年份列表中的所有行
    filtered_rows = einzel[einzel["PY"].isin(target_years)]
    # 保存到对应CSV文件,index=False避免写入多余的索引列
    filtered_rows.to_csv(output_file, sep='\t', index=False, encoding="utf-8")

方案优势说明

  1. 用isin()方法替代直接比较,完美解决了序列长度不匹配的问题,准确判断每行数据的年份是否属于目标分组。
  2. 直接调用pandas的to_csv方法,省去了手动初始化Writer、逐行写入的繁琐步骤,代码更简洁。
  3. 批量筛选后一次性保存,比逐行循环的效率高很多,尤其是处理大数据量时优势更明显。

额外拓展:按单个年份拆分

如果后续你需要将每个年份的数据单独保存为一个CSV文件,可以用更高效的分组写法:

# 按PY列分组,每个年份对应一个独立CSV文件
for year, group_data in einzel.groupby("PY"):
    group_data.to_csv(f"{year}.csv", sep='\t', index=False, encoding="utf-8")

内容的提问来源于stack exchange,提问作者Seeamoebe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:20:41