Python Pandas read_csv跳过行但保留标题


76

我在弄清楚如何跳过csv文件中的n行但保留标题为1行时遇到了麻烦。

我想做的是迭代但保留第一行的标题。 skiprows将标题设置为跳过的行之后的第一行。最好的方法是什么?

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

Answers:


119

您可以将行号列表传递给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
    

12

已经有了不错的答案。.我不知何故在这里需要添加广义形式。.考虑这种情况:-

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

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


简短但很好的解释!
codebusta

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


1

如果要遍历长的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)

1

如果您需要跳过/删除特定的行,请说前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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.