read_csv смещение столбцов и пропуск неправильных строк - PullRequest
0 голосов
/ 21 сентября 2019

Я использую Pandas для read_csv, чтобы импортировать CSV-файл в блокнот Jupyter.

Файл CSV можно найти по этой ссылке .У него есть две пустые строки перед строкой заголовка.Когда я использую:

df = pd.read_csv('data/2008-03-21_downloaded.csv', skiprows= 2)

В результирующем df все заголовки столбцов смещены.

Если я добавлю index_col=False:

df = pd.read_csv('data/2008-03-21_downloaded.csv', skiprows=[1,2], index_col=False)

Результат используетстрока данных в качестве заголовка вместо фактических имен заголовков.

Я не могу пропустить первые две строки и использовать фактические заголовки в качестве заголовков [Account, Account Account, Amount, etc ...]

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Ваша первая версия кода в порядке.Две начальные строки пусты и должны быть пропущены.

Но обратите внимание, что одно из имен столбцов во входном файле (см. DATA view - в течение некоторого времени ваш пост содержал его) содержит % 2C , то есть шестнадцатеричный код для запятой .

Так что, очевидно, ваш заголовок поврежден, и поэтому в вашем представлении DATA естьнесколько заголовков столбцов, например Безымянный .

Один из вариантов - это упорядочить строку заголовка в этой детали (замените каждый «% 2C» запятой), а затем повторите чтение.

Другой вариант:

  • pass skiprows = 3 параметр (пропустить также строку заголовка),
  • pass names параметр с правильными именами столбцов для всех столбцов.

Ваша вторая версия кода неверна, поскольку нумерация строк начинается с ноль .Не вводите в заблуждение номера строк в Excel, которые начинаются с one .

0 голосов
/ 22 сентября 2019

Исправьте ваш csv файл:

  • , как отмечалось, заголовок немного запутан.Следующий код заменит %2CTXT_ и %2C на ,
  • . Это необходимо только в том случае, если у вас есть более одного файла, требующего исправления
  • , при необходимости вы можете добавить дополнительные исправления.
  • pathlib является частью стандартной библиотеки
from pathlib import Path

p = Path('some_path')
files = p.rglob('*.csv')  # files in top dir and all subdirs


for file in files:
    file_updated = file.parents[0] / f'{file.stem}_updated{file.suffix}'
    with file.open('r') as f:
        with file_updated.open('w') as f2:
            for cnt, line in enumerate(f):
                if 'ACCOUNT NAME' in line.split(','):
                    print(cnt, line)
                    line = line.replace('%2CTXT_', ',')
                    line = line.replace('%2C', ',')
                    print(cnt, line)

                f2.write(line)
  • Когда яскачал и протестировал ваш файл, скрипт не считывал дополнительные строки перед заголовком, что, я думаю, связано с  перед учетной записью, в заголовке.
  • Вместо того, чтобы перезаписывать старый файл, мы создадимновый файл с добавлением _updated к stem.

Считывание файлов _updated в один кадр данных:

p = Path('some_path')
files = p.rglob('*_updated.csv')

df = pd.concat([pd.read_csv(file) for file in files])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...