在 csv 导入 pandas 期间跳过行

Posted

技术标签:

【中文标题】在 csv 导入 pandas 期间跳过行【英文标题】:Skip rows during csv import pandas 【发布时间】:2014-01-05 09:49:07 【问题描述】:

我正在尝试使用 pandas.read_csv() 导入 .csv 文件,但是,我不想导入数据文件的第二行(索引 = 1 的行用于 0 索引)。

我看不出如何不导入它,因为与命令一起使用的参数似乎模棱两可:

来自熊猫网站:

skiprows:类列表或整数

要跳过的行数(0-indexed)或要跳过的行数(int) 文件的开头。”

如果我在参数中输入skiprows=1,它如何知道是跳过第一行还是跳过索引为1的行?

【问题讨论】:

我猜想它可以是“类列表或整数”,然后给你两个选项(跳过行或在开始时跳过 # 行)然后如果你给它列表[1] 它只会跳过第 1 行(第 2 行)。如果您给它一个整数(例如 10),那么它将跳过前 10 行。 效果很好。非常感谢。只是想知道它如何区分索引和int。 [] 就是答案。 【参考方案1】:

你可以自己试试:

>>> import pandas as pd
>>> from StringIO import StringIO
>>> s = """1, 2
... 3, 4
... 5, 6"""
>>> pd.read_csv(StringIO(s), skiprows=[1], header=None)
   0  1
0  1  2
1  5  6
>>> pd.read_csv(StringIO(s), skiprows=1, header=None)
   0  1
0  3  4
1  5  6

【讨论】:

是的,谢谢,我只需要知道索引是在方括号 [] 内指定的。 在 Python 3 中:from io import StringIO【参考方案2】:

我还没有评论的声誉,但我想添加到alko 答案以供进一步参考。

来自docs:

skiprows:文件中要跳过的行的数字集合。也可以是整数来跳过前n行

【讨论】:

【参考方案3】:

我在读取 csv 文件时运行 skiprows 时遇到了同样的问题。 我在做 skip_rows=1 这不起作用

简单的例子说明了如何在读取 csv 文件时使用 skiprows。

import pandas as pd

#skiprows=1 will skip first line and try to read from second line
df = pd.read_csv('my_csv_file.csv', skiprows=1)  ## pandas as pd

#print the data frame
df

【讨论】:

【参考方案4】:

所有这些答案都忽略了一个重要点——第 n 行是文件中的第 n 行,而不是数据集中的第 n 行。我有一种情况,我从 USGS 下载了一些过时的流量测量仪数据。数据集的头部用“#”注释,之后的第一行是标签,接下来是描述日期类型的行,最后是数据本身。我永远不知道有多少注释行,但我知道前几行是什么。示例:

> # ----------------------------- WARNING ----------------------------------
> # Some of the data that you have obtained from this U.S. Geological Survey database
> # may not have received Director's approval. ... agency_cd    site_no datetime    tz_cd   139719_00065    139719_00065_cd
> 5s    15s 20d 6s  14n 10s USGS    08041780    2018-05-06 00:00    CDT 1.98    A

如果有一种方法可以自动跳过第 n 行和第 n 行,那就太好了。

作为说明,我能够解决我的问题:

import pandas as pd
ds = pd.read_csv(fname, comment='#', sep='\t', header=0, parse_dates=True)
ds.drop(0, inplace=True)

【讨论】:

【参考方案5】:

read_csv 中的索引指的是 csv 文件中的行号/行号(第一行的索引为 0)。您有以下选项可以跳过行:

from io import StringIO

csv = \
"""col1,col2
1,a
2,b
3,c
4,d
"""
pd.read_csv(StringIO(csv))

# Output:
   col1 col2  # index 0
0     1    a  # index 1
1     2    b  # index 2
2     3    c  # index 3
3     4    d  # index 4

在文件开头跳过两行(索引 0 和 1)。列名也被跳过(索引 0),顶行用于列名。要添加列名,请使用names = ['col1', 'col2'] 参数:

pd.read_csv(StringIO(csv), skiprows=2)

# Output:
   2  b
0  3  c
1  4  d

跳过第二行和第四行(索引 1 和 3):

pd.read_csv(StringIO(csv), skiprows=[1, 3])

# Output:
   col1 col2
0     2    b
1     4    d

跳过最后两行:

pd.read_csv(StringIO(csv), engine='python', skipfooter=2)

# Output:
   col1 col2
0     1    a
1     2    b

使用 lambda 函数跳过每一行(索引 1 和 3):

pd.read_csv(StringIO(csv), skiprows=lambda x: (x % 2) != 0)

# Output:
   col1 col2
0     2    b
1     4    d

【讨论】:

【参考方案6】:

skip[1] 将跳过第二行,而不是第一行。

【讨论】:

以上是关于在 csv 导入 pandas 期间跳过行的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas read_csv 跳过行但保留标题

Pandas-如何添加条目跳过行的列?

使用跳过行在 Spark 中读取 csv

在过去 24 小时内从 MySQL 中选择行并根据间隔 X 跳过行?

Python Pandas,读取文件并在标题前跳过行

通过 pandas.read_excel 在标题后跳过行范围