一行代码实现CSV操作报错排查:合并IMO列遇IndexError索引越界
解决方案:两个Pandas批量处理需求的一行代码实现
需求1:将多个文件的所有列合并到一行中
要实现把多个CSV文件的所有列内容合并成单独一行,可以通过读取每个文件后将数据扁平化,再拼接成单行:
import pandas as pd; combined_row = pd.concat([pd.read_csv(f).unstack() for f in your_file_list], axis=0).to_frame().T
解释:
pd.read_csv(f).unstack()会把每个文件的所有列和行的内容展开成一个Series(扁平化处理)pd.concat(..., axis=0)把所有扁平化后的Series拼接成一个大Series.to_frame().T将这个大Series转成单行的DataFrame
需求2:提取指定CSV文件的'IMO'列并合并
原代码错误原因
你遇到的IndexError: list index out of range是因为部分文件名(比如unique_boat_names.csv)用_分割后不足4个元素,访问split('_')[3]会超出索引范围。另外你的判断逻辑依赖固定的分割位置,不够灵活,应该换一种方式识别“以数字结尾”的文件名。
修正后的一行代码
这里用正则表达式匹配文件名末尾(.csv前)带有数字的文件,同时用os.path.join处理路径更安全:
import pandas as pd, re, os; df = pd.concat([pd.read_csv(os.path.join(path, f))['IMO'] for f in all_names if re.search(r'_\d+\.csv$', f)], ignore_index=True)
或者用更直观的文件名判断(提取不含扩展名的部分,检查最后一段是否为数字):
import pandas as pd, os; df = pd.concat([pd.read_csv(os.path.join(path, f))['IMO'] for f in all_names if os.path.splitext(f)[0].split('_')[-1].isdigit()], ignore_index=True)
解释:
re.search(r'_\d+\.csv$', f):匹配文件名以_+数字+.csv结尾的文件,精准命中你需要的年份结尾的文件os.path.splitext(f)[0].split('_')[-1].isdigit():提取文件名(去掉.csv),分割后取最后一段判断是否为数字ignore_index=True:合并后重置索引,避免原文件索引冲突
内容的提问来源于stack exchange,提问作者LeBruceWayne
相关产品推荐
相关产品推荐

