按列值拆分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")
方案优势说明
- 用
isin()方法替代直接比较,完美解决了序列长度不匹配的问题,准确判断每行数据的年份是否属于目标分组。 - 直接调用pandas的
to_csv方法,省去了手动初始化Writer、逐行写入的繁琐步骤,代码更简洁。 - 批量筛选后一次性保存,比逐行循环的效率高很多,尤其是处理大数据量时优势更明显。
额外拓展:按单个年份拆分
如果后续你需要将每个年份的数据单独保存为一个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
相关产品推荐
相关产品推荐

