如何用Pandas读取存在异常行的CSV文件的最后n列?
提取CSV每行最后n个单元格的Pandas解决方案
针对你遇到的CSV行长度不一致,需要提取每行最后n个存在的单元格的问题,可以通过以下方法实现:
方法一:读取后按行截取末尾n个元素
先完整读取CSV文件,再对每行从末尾截取n个元素,最后匹配对应的表头:
import pandas as pd # 读取CSV文件,指定表头为第一行,用str类型避免自动类型转换导致的问题 df = pd.read_csv("your_file.csv", header=0, dtype=str) n = 3 # 要提取的最后n个单元格数量 # 对每行截取最后n个元素 result_df = df.apply(lambda row: row.iloc[-n:], axis=1) # 将结果的列名设置为原表头的最后n个 result_df.columns = df.columns[-n:] print(result_df)
运行后会得到你期望的结果:
Col3 Col4 Col5 0 a3 a4 a5 1 b3 b4 b5 2 c3 c4 c5 3 d3 d4 d5
为什么usecols不适用?
你之前用usecols=[2,3,4]会出现NaN,是因为Pandas读取CSV时,会按顺序将每行的元素填充到对应的列中。当某行的元素数量少于表头列数时,后面的列会被填充NaN,而前面的元素依然对应最左侧的列,导致你选取的固定列索引会拿到错位的数据。而通过row.iloc[-n:]截取每行末尾的n个元素,不管前面有多少缺失,都能准确拿到每行最右侧的有效数据。
方法二:无表头读取后处理(更严谨)
如果担心表头行和数据行的长度差异影响读取,可以先不指定表头,处理后再设置:
import pandas as pd # 读取所有内容,不设置表头 temp_df = pd.read_csv("your_file.csv", header=None, dtype=str) # 提取第一行作为表头 header = temp_df.iloc[0] # 提取数据行 data = temp_df.iloc[1:] n = 3 # 对每行先去除NaN,再截取最后n个元素(确保只取存在的单元格) result_df = data.apply(lambda row: row.dropna().iloc[-n:], axis=1) # 设置列名为原表头的最后n个 result_df.columns = header[-n:] # 重置索引 result_df = result_df.reset_index(drop=True) print(result_df)
这个方法适合更复杂的行长度不一致场景,确保只提取每行实际存在的最后n个单元格。
内容的提问来源于stack exchange,提问作者Diego H
相关产品推荐
相关产品推荐

