我有一些CSV文件,我使用以下代码在pandas中读取:
#!/usr/bin/env python
import pandas as pd
import sys
filename = sys.argv[1]
df = pd.read_csv(filename)
不幸的是,这些文件的最后一行通常会损坏(逗号数量错误)。目前我会在文本编辑器中打开每个文件并删除最后一行。
是否可以在同一Python/Pandas脚本中删除最后一行,以避免采取这个额外的非自动化步骤?
通过 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引擎慢。
skipfooter
选项,需要知道它与 dtypes
选项不兼容:
ValueError: 因为 'c' 引擎不支持 skipfooter,所以回退到 'python' 引擎,但这会导致 'dtype' 被忽略,因为它不受 'python' 引擎的支持。(请注意,'converters' 选项提供了类似的功能。)
- n1k31t4pd.read_csv(filename, skiprows=[999])
(在我的情况下有1000行)-请注意,如果您想要按行号指定行,则必须将行定义为列表。 - Chaostenrows
吗? - EdChumnrows=999
而不是skiprows=[1000]
。另一个解决方案可能是通过命令行删除最后一行,这非常快:head -n -1 dataframe.csv > temp.csv && mv temp.csv dataframe.csv
。 - Chaosteerror_bad_lines=False
参数可以让它在 C 引擎下正常工作并且速度很快。 - EdChum使用skipfooter
参数可以在读取csv时省略最后n行:
df = pd.read_csv(filename, skipfooter=3, engine='python')
在这个例子中,最后三行被省略了。
阅读 http://pandas.pydata.org/pandas-docs/version/0.16.2/generated/pandas.read_csv.html。这里可以使用'skipfooter'参数来指定从.csv文件末尾不想读取的行数。也许这对你有帮助。
df = pd.read_csv(filename)[:-1]
str.extract
:for col in df.columns[2:]: df[col] = df[col].str.extract(r'(\d+)').astype(int)
- EdChum