Python Pandas read_csv 跳过行但保留标题

Posted

技术标签:

【中文标题】Python Pandas read_csv 跳过行但保留标题【英文标题】:Python Pandas read_csv skip rows but keep header 【发布时间】:2015-02-04 04:47:13 【问题描述】:

我无法弄清楚如何跳过 csv 文件中的 n 行但保留第 1 行的标题。

我想要做的是迭代但保留第一行的标题。 skiprows 使标题成为跳过行之后的第一行。这样做的最佳方法是什么?

data = pd.read_csv('test.csv', sep='|', header=0, skiprows=10, nrows=10)

【问题讨论】:

【参考方案1】:

您可以将行号列表传递给skiprows,而不是整数。

通过为函数提供整数 10,您只是跳过了前 10 行。

要保留第一行 0(作为标题),然后跳过其他所有内容直到第 10 行,您可以这样写:

pd.read_csv('test.csv', sep='|', skiprows=range(1, 10))

使用read_csv 跳过行的其他方法

控制read_csv 使用哪些行的两种主要方法是headerskiprows 参数。

假设我们有以下包含一列的 CSV 文件:

a
b
c
d
e
f

在以下每个示例中,此文件为 f = io.StringIO("\n".join("abcdef"))

将所有行作为值读取(无标题,默认为整数)

>>> pd.read_csv(f, header=None)
   0
0  a
1  b
2  c
3  d
4  e
5  f

使用特定的行作为标题(跳过之前的所有行):

>>> pd.read_csv(f, header=3)
   d
0  e
1  f

使用多行作为创建 MultiIndex 的标题(跳过最后指定标题行之前的所有行):

>>> pd.read_csv(f, header=[2, 4])                                                                                                                                                                        
   c
   e
0  f

从文件开头跳过N行(第一行没有跳过的是标题):

>>> pd.read_csv(f, skiprows=3)                                                                                                                                                                      
   d
0  e
1  f

通过给出行索引来跳过一个或多个行(第一行没有跳过的是标题):

>>> pd.read_csv(f, skiprows=[2, 4])                                                                                                                                                                      
   a
0  b
1  d
2  f

【讨论】:

【参考方案2】:

已经有了很好的答案。考虑这个一般化的场景:

假设您的 xls/csv 在前 2 行(第 #0,1 行)中有垃圾行。第 2 行(第 3 行)是真正的标题,您想从第 50 行(即第 51 行)开始加载 10 行。

这是sn-p:

pd.read_csv('test.csv', header=2, skiprows=range(3, 50), nrows=10)

【讨论】:

【参考方案3】:

为了扩展@AlexRiley 的答案,skiprows 参数采用一个数字列表,用于确定要跳过的行。所以:

pd.read_csv('test.csv', sep='|', skiprows=range(1, 10))

等同于:

pd.read_csv('test.csv', sep='|', skiprows=[1,2,3,4,5,6,7,8,9])

忽略特定行的最佳方法是创建您的忽略列表(手动或使用返回整数列表的range 之类的函数)并将其传递给skiprows

【讨论】:

【参考方案4】:

如果您要遍历一个长 csv 文件,您可以使用 chunksize 参数。如果由于某种原因需要手动单步执行,只要知道需要执行多少次迭代,就可以尝试以下操作:

for i in range(num_iters):
    pd.read_csv('test.csv', sep='|', header=0, 
                 skiprows = range(i*10 + 1, (i+1)*10), nrows=10)

【讨论】:

【参考方案5】:

如果您需要跳过/删除特定行,请先说前 3 行(即 0,1,2),然后再说 2 行(即 4,5)。您可以使用以下内容来保留标题行:

df = pd.read_csv(file_in, delimiter='\t', skiprows=[0,1,2,4,5], encoding='utf-16', usecols=cols)

【讨论】:

以上是关于Python Pandas read_csv 跳过行但保留标题的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用read_csv读取数据使用skiprows参数跳过指定的数据行但保留表头pandas使用to_csv函数将dataframe保存为gzip压缩文件

如何让pandas停止跳过TSV文件中的第一个空白列?

Python Pandas 中的引擎 read_csv

在 csv 导入 pandas 期间跳过行

Python Pandas——Read_csv详解

python 在pandas中的read_csv时将值转换为demical