Pandas: несоответствие размера заголовка CSV и строки данных - PullRequest
0 голосов
/ 10 октября 2018

Можно ли дать Pandas команду игнорировать столбцы, позиции которых превышают размер заголовка?

import pandas

with open('test.csv', mode='w') as csv_file:
    csv_file.write("datetime,A\n")
    csv_file.write("2018-10-09 18:00:07, 123\n")

df = pandas.read_csv('test.csv')
print(df)

дает ответ:

              datetime    A
0  2018-10-09 18:00:07  123

Однако загрузка файла CSV с большим количеством столбцов данных,что определено в заголовке:

with open('test.csv', mode='w') as csv_file:
    csv_file.write("datetime,A\n")
    csv_file.write("2018-10-09 18:00:07, 123, ABC, XYZ\n")

df = pandas.read_csv('test.csv')
print(df)

возвращает:

                        datetime     A
2018-10-09 18:00:07 123      ABC   XYZ

Pandas перемещает заголовки в крайнее правое положение данных.

Мне нужно другое поведение.Я бы хотел, чтобы панды игнорировали строки данных, которые выходят за пределы заголовка.

Примечание : я не могу перечислить столбцы, поскольку это общий вариант использования.Из-за какой-то независимой от моего кода причины иногда бывает больше данных, чем ожидалось.Я хотел бы игнорировать дополнительные данные.

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Чтобы завершить вопрос, вот код, который делает трюк:

with open('test.csv', mode='w') as csv_file:
    csv_file.write("datetime,A, B, C\n")
    csv_file.write("2018-10-09 18:00:07, 123\n")

with open("test.csv") as csv_file:
    for i, line in enumerate(csv_file):
        if i == 0:
            headerCount = line.count(",") + 2
        elif i == 1:
            dataCount = line.count(",") + 2  
            if (headerCount != dataCount):
                print("Warning: Header and data size mismatch. Columns beyond header size will be removed.")
        elif i > 1:
            break


df = pandas.read_csv('test.csv', usecols=range(dataCount-1))
print(df)

дает правильный объект панды.

Warning: Header and data size mismatch. Columns beyond header size will be removed.
              datetime    A
0  2018-10-09 18:00:07  123
0 голосов
/ 10 октября 2018

Теперь код показывает ответ на вопрос.

with open('test.csv', mode='w') as csv_file:
    csv_file.write("datetime,A\n")
    csv_file.write("2018-10-09 18:00:07, 123, ABC, XYZ\n")

with open("test.csv") as csv_file:
    for i, line in enumerate(csv_file):
        if i == 0:
            headerCount = line.count(",") + 1
            colCount = headerCount
        elif i == 1:
            dataCount = line.count(",") + 1  
        elif i > 1:
            break
if (headerCount < dataCount):
    print("Warning: Header and data size mismatch. Columns beyond header size will be removed.")
    colCount=headerCount

df = pandas.read_csv('test.csv', usecols=range(colCount))
print(df)

производит:

Warning: Header and data size mismatch. Columns beyond header size will be removed.
              datetime    A
0  2018-10-09 18:00:07  123
0 голосов
/ 10 октября 2018

Кажется, Пандас понимает, что слишком много столбцов по сравнению с фактическим заголовком, и предполагает, что первые два столбца (данных) являются (мульти) индексом.

Укажите столбцы данных для чтения с параметром usecols в read_csv:

import pandas

with open('test.csv', mode='w') as csv_file:
    csv_file.write("datetime,A\n")
    csv_file.write("2018-10-09 18:00:07, 123, ABC, XYZ\n")

df = pandas.read_csv('test.csv', usecols=[0,1]) 
print(df)

выход

              datetime    A
0  2018-10-09 18:00:07  123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...