Python Pandas read_csv пропускає рядки, але зберігає заголовок


76

У мене виникають проблеми з тим, як пропустити n рядків у файлі csv, але зберегти заголовок, який є 1 рядком.

Що я хочу зробити, це повторити, але зберегти заголовок з першого рядка. skiprowsробить заголовок першим рядком після пропущених рядків. Який найкращий спосіб зробити це?

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

Відповіді:


120

Ви можете передати список номерів рядків skiprowsзамість цілого числа.

Надавши функції ціле число 10, ви просто пропускаєте перші 10 рядків.

Щоб зберегти перший рядок 0 (як заголовок), а потім пропустити все інше до рядка 10, ви можете написати:

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

Інші способи пропуску рядків за допомогою read_csv

Двома основними способами керування read_csvвикористовуваними рядками є параметри headerабо skiprows.

Припустимо, у нас є такий файл 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-й рядок) є справжнім заголовком, і ви хочете завантажити 10 рядків, починаючи з рядка # 50 (тобто 51-й рядок) .. Ось фрагмент: -

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.