Добавьте отступы в CSV-файл, чтобы сделать фрейм данных читаемым для панд. - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть несколько данных в CSV-файлах (похожая структура данных, но не одинаковая), с разными размерами строк и столбцов для определенных строк.

Например, первые три строки каждого CSV-файла имеют различное количество столбцов, например:

----------------
Table | Format |
----------------
Code  | Label  | Index  |
-----------------------------------------
  a   |   b    |   c    |   d   |   e   |
-----------------------------------------

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

Я хочу сделать таблицу так, чтобы она распознавала максимальную длину столбцов в файле и добавляла любые отступы к пустым пространствам, чтобы сделать размеры равными.то есть.

-----------------------------------------
Table | Format |  pad   |  pad  |  pad  |
-----------------------------------------
Code  | Label  | Index  |  pad  |  pad  |
-----------------------------------------
  a   |   b    |   c    |   d   |   e   |
-----------------------------------------

До сих пор я изучал чтение панд и добавление заголовков в CSV-файл, но поскольку максимальное количество столбцов для каждого CSV-файла варьируется, я застрял.

Любая помощь или указатель будут благодарны!

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вот небольшой скрипт, который я написал для разметки столбцов, полученных из кадра данных pandas.Мой файл был промежуточным файлом, разделенным каналом:

INPUT_FILE = r'blah.txt'
OUTPUT_FILE = r'blah.TAB'

col_widths = []
with open(INPUT_FILE, "r") as fi:
    line = fi.readline()
    headers = line.split(sep='|')
    for h in headers:
        col_widths.append(len(h))

with open(INPUT_FILE) as fi:
    line = fi.readline()
    while line:
        cols = line.split(sep='|')
        line = fi.readline()
        index = 0
        for c in cols:
            if len(c) > col_widths[index]:
                col_widths[index] = len(c)
            index += 1

with open(INPUT_FILE) as fi:
    fo = open(OUTPUT_FILE, 'w')
    line = fi.readline()
    while line:
        tokens = line.split(sep='|')
        index = 0
        for t in tokens:
            if index == len(col_widths) - 1:
                t = t.rstrip('\r\n')
            ft = '{:<' + str(col_widths[index]) + '}'
            v = ft.format(t)
            fo.write(v + '|')
            index += 1
        fo.write('\r')
        line = fi.readline()
    fo.close()
0 голосов
/ 20 февраля 2019

Если ваш разделитель столбцов - запятая, вы можете заполнить ее, просто вставив соответствующее количество запятых в конце каждой строки.Использование read_csv pandas будет считывать дополненные значения как NaN.

with open('/path/to/data.csv', 'r') as f:
    data = f.read().split()

# Count the the number of columns in each line
cols = [row.count(',')+1 for row in data]
# Find the widest row
max_cols = max(cols)

# Loop over lines in text
for id, row in enumerate(data):
    # Pad extra columns when necessary
    if cols[id] < max_cols:
        data[id] += (max_cols - cols[id]) * ','

# Write the data out
with open('/path/to/pad_data.csv', 'w') as f:
    f.write('\n'.join(data))

Настройка некоторых тестовых данных:

data = '1,2,3\n4,\n5,6,7,8,9\n'
print(data)
#1,2,3
#4,
#5,6,7,8,9

Применение вышеуказанного метода дает:

print('\n'.join(pad_data))
#1,2,3,,
#4,,,,
#5,6,7,8,9
...