Считайте CSV в dataFrame с переменной длиной строки, используя Pandas - PullRequest
1 голос
/ 12 марта 2019

Итак, у меня есть CSV, который выглядит примерно так:

1 | 01-01-2019 | 724
2 | 01-01-2019 | 233 | 436
3 | 01-01-2019 | 345
4 | 01-01-2019 | 803 | 933 | 943 | 923 | 954
5 | 01-01-2019 | 454
...

И когда я пытаюсь использовать следующий код для генерации фрейма данных ..

df = pd.read_csv('data.csv', header=0, engine='c', error_bad_lines=False)

Это толькодобавляет в df строки с 3 столбцами (строки 1, 3 и 5 сверху)

Остальные считаются «плохими строками», что приводит меня к следующей ошибке:

Skipping line 17467: expected 3 fields, saw 9

Как мнесоздать фрейм данных, который включает в себя все данные в моем CSV, возможно, просто заполняя пустые ячейки нулем?Или я должен объявить максимальную длину строки перед добавлением в df?

Спасибо!

Ответы [ 6 ]

3 голосов
/ 12 марта 2019

Если используется только pandas, читайте в строках, разбирайте разделитель после.

import pandas as pd

df = pd.read_csv('data.csv', header=None, sep='\n')
df = df[0].str.split('\s\|\s', expand=True)

   0           1    2     3     4     5     6
0  1  01-01-2019  724  None  None  None  None
1  2  01-01-2019  233   436  None  None  None
2  3  01-01-2019  345  None  None  None  None
3  4  01-01-2019  803   933   943   923   954
4  5  01-01-2019  454  None  None  None  None
1 голос
/ 12 марта 2019

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

file.csv:

a,b,c,d,e
1,2,3
3
2,3,4

код:

>>> import pandas as pd
>>> pd.read_csv('file.csv')
   a    b    c   d   e
0  1  2.0  3.0 NaN NaN
1  3  NaN  NaN NaN NaN
2  2  3.0  4.0 NaN NaN
1 голос
/ 12 марта 2019

Чтение фиксированной ширины должно работать:

from io import StringIO

s = '''1  01-01-2019  724
2  01-01-2019  233  436
3  01-01-2019  345
4  01-01-2019  803  933  943  923  954
5  01-01-2019  454'''


pd.read_fwf(StringIO(s), header=None)

   0           1    2      3      4      5      6
0  1  01-01-2019  724    NaN    NaN    NaN    NaN
1  2  01-01-2019  233  436.0    NaN    NaN    NaN
2  3  01-01-2019  345    NaN    NaN    NaN    NaN
3  4  01-01-2019  803  933.0  943.0  923.0  954.0
4  5  01-01-2019  454    NaN    NaN    NaN    NaN

или с delimiter параметром

s = '''1 | 01-01-2019 | 724
2 | 01-01-2019 | 233 | 436
3 | 01-01-2019 | 345
4 | 01-01-2019 | 803 | 933 | 943 | 923 | 954
5 | 01-01-2019 | 454'''


pd.read_fwf(StringIO(s), header=None, delimiter='|')

   0             1    2      3      4      5      6
0  1   01-01-2019   724    NaN    NaN    NaN    NaN
1  2   01-01-2019   233  436.0    NaN    NaN    NaN
2  3   01-01-2019   345    NaN    NaN    NaN    NaN
3  4   01-01-2019   803  933.0  943.0  923.0  954.0
4  5   01-01-2019   454    NaN    NaN    NaN    NaN

обратите внимание, что для вашего фактического файла вы не будете использовать StringIO, вы просто замените его на путь к файлу: pd.read_fwf('data.csv', delimiter='|', header=None)

0 голосов
/ 15 марта 2019

Если вы знаете, что данные содержат N столбцы, вы можете сообщите Pandas заранее, сколько столбцов ожидать с помощью параметра names:

import pandas as pd
df = pd.read_csv('data', delimiter='|', names=list(range(7)))
print(df)

выходы

   0             1    2      3      4      5      6
0  1   01-01-2019   724    NaN    NaN    NaN    NaN
1  2   01-01-2019   233  436.0    NaN    NaN    NaN
2  3   01-01-2019   345    NaN    NaN    NaN    NaN
3  4   01-01-2019   803  933.0  943.0  923.0  954.0
4  5   01-01-2019   454    NaN    NaN    NaN    NaN

Если у вас есть верхний предел, N, на количество столбцов, то вы можете Панды читают N столбцы, а затем используют dropna для удаления полностью пустых столбцов:

import pandas as pd
df = pd.read_csv('data', delimiter='|', names=list(range(20))).dropna(axis='columns', how='all')
print(df)

выходы

   0             1    2      3      4      5      6
0  1   01-01-2019   724    NaN    NaN    NaN    NaN
1  2   01-01-2019   233  436.0    NaN    NaN    NaN
2  3   01-01-2019   345    NaN    NaN    NaN    NaN
3  4   01-01-2019   803  933.0  943.0  923.0  954.0
4  5   01-01-2019   454    NaN    NaN    NaN    NaN

Обратите внимание, что это может привести к удалению столбцов из середины набора данных (не только столбцы справа), если они полностью пусты.

0 голосов
/ 13 марта 2019
colnames= [str(i) for i in range(9)]
df = pd.read_table('data.csv', header=None, sep=',', names=colnames)

Измените 9 в именах на число x, если код выдает ошибку

Skipping line 17467: expected 3 fields, saw x
0 голосов
/ 12 марта 2019

Рассмотрите возможность использования Python csv для подъема данных и обработки формата. Вы можете реализовать собственный диалект, чтобы обрабатывать различные csv-ness.

import csv
import pandas as pd

csv_data = """1 | 01-01-2019 | 724
2 | 01-01-2019 | 233 | 436
3 | 01-01-2019 | 345
4 | 01-01-2019 | 803 | 933 | 943 | 923 | 954
5 | 01-01-2019 | 454"""

with open('test1.csv', 'w') as f:
    f.write(csv_data)

csv.register_dialect('PipeDialect', delimiter='|')
with open('test1.csv') as csvfile:
    data = [row for row in csv.reader(csvfile, 'PipeDialect')]
df = pd.DataFrame(data = data)

Предоставляет вам диалект импорта csv и следующий DataFrame:

    0             1      2      3      4      5     6
0  1    01-01-2019     724   None   None   None  None
1  2    01-01-2019    233     436   None   None  None
2  3    01-01-2019     345   None   None   None  None
3  4    01-01-2019    803    933    943    923    954
4  5    01-01-2019     454   None   None   None  None

В качестве упражнения обрабатывается заполнение пробелов во входном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...