在pandas中读取CSV文件除了最后一行的所有内容

35

我有一些CSV文件,我使用以下代码在pandas中读取:

#!/usr/bin/env python

import pandas as pd
import sys

filename = sys.argv[1]
df = pd.read_csv(filename)

不幸的是,这些文件的最后一行通常会损坏(逗号数量错误)。目前我会在文本编辑器中打开每个文件并删除最后一行。

是否可以在同一Python/Pandas脚本中删除最后一行,以避免采取这个额外的非自动化步骤?


你删除了一个关于提取数字的问题,但是我本来想建议使用 str.extractfor col in df.columns[2:]: df[col] = df[col].str.extract(r'(\d+)').astype(int) - EdChum
@EdChum 你的代码保留小数点吗? - Simd
@EdChum,我恢复了之前的问题。 - Simd
4个回答

36

通过 on_bad_lines='skip' 来进行设置,它将自动跳过这一行

df = pd.read_csv(filename, on_bad_lines='skip')
  • on_bad_lines='skip'的优点是它会跳过并且不会在任何错误行上出错。但是如果最后一行总是无效的,那么skipfooter=1更好。

  • 感谢@DexterMorgan指出skipfooter选项会强制引擎使用Python引擎,而解析CSV文件时Python引擎比C引擎慢。


这是一个旧版本(不要使用 - 它已从pandas2.0中删除):
df = pd.read_csv(filename, error_bad_lines=False)
自1.3.0版本起已弃用:应改用on_bad_lines参数来指定遇到错误行时的行为。

1
关于 skipfooter 选项,需要知道它与 dtypes 选项不兼容: ValueError: 因为 'c' 引擎不支持 skipfooter,所以回退到 'python' 引擎,但这会导致 'dtype' 被忽略,因为它不受 'python' 引擎的支持。(请注意,'converters' 选项提供了类似的功能。) - n1k31t4
@DexterMorgan 确定会添加。 - EdChum
2
有一个名为'skiprows'的选项,它是使用c引擎支持的。如果您知道csv文件的行数,您可以采用以下方式添加:pd.read_csv(filename, skiprows=[999])(在我的情况下有1000行)-请注意,如果您想要按行号指定行,则必须将行定义为列表。 - Chaoste
@Chaoste 但是坏行在末尾,你不想用 nrows 吗? - EdChum
1
@EdChum,我现在只是查看文档,因为我需要它,但直到现在我才发现这个选项。谢谢! 所以在我的情况下,我不得不写nrows=999而不是skiprows=[1000]。另一个解决方案可能是通过命令行删除最后一行,这非常快:head -n -1 dataframe.csv > temp.csv && mv temp.csv dataframe.csv - Chaoste
当然,文档写得很好。我认为使用 error_bad_lines=False 参数可以让它在 C 引擎下正常工作并且速度很快。 - EdChum

20

使用skipfooter参数可以在读取csv时省略最后n行:

df = pd.read_csv(filename, skipfooter=3, engine='python')

在这个例子中,最后三行被省略了。


11

0
如果它始终且仅仅是最后一行,我们可以这样做 -
df = pd.read_csv(filename)[:-1]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接