Python Pandas и генератор для обработки строк в CSV

#python #pandas #generator

#python #pandas #генератор

Вопрос:

Надеюсь, что это допустимый вопрос SO, но я надеюсь получить несколько советов о том, как преобразовать приведенный ниже код, который обрабатывает строки в файле для создания фрейма данных, в тот, который использует генераторы и результаты, потому что эта реализация с использованием list и append слишком медленная.

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

Пример строк в файле:

 "USNC3255","27","US","NC","LANDS   END","72305006","KNJM","KNCA","KNKT","T72305006","","","NCC031","NCZ095","","545","28594","America/New_York","34.65266","-77.07661","7","RDU","893727","
"USNC3256","27","US","NC","LANDSDOWN","72314058","KEHO","KAKH","KIPJ","T72314058","","","NCC045","NCZ068","sc007","517","28150","America/New_York","35.29374","-81.46537","797","CLT","317845","
  

Текущее решение:

 def parse_file(filename):

    newline = []

    with open(filename, 'rb') as f:
        reader = csv.reader(f, quoting=csv.QUOTE_NONE)
        for row in reader:
            newline.append([s.strip('"') for s in row[:-1]])
    df = pd.DataFrame(newline)
    df = df.applymap(lambda x: nan if len(x) == 0 else x).astype(object)
    return df

df = parse_file(filename)
  

Вывод — это просто фрейм данных с 23 столбцами и двумя строками, если он используется для примера строк выше.

Ответ №1:

Единственная проблема с вашим файлом заключается в том, что каждая строка заканчивается ," . Это сбивает с толку анализатор. Если вы можете удалить конечную запятую и кавычки, вы можете использовать обычный анализатор.

 import pandas as pd
from StringIO import StringIO
with open('example.txt') as myfile:
    data = myfile.read().replace(',"n', 'n')
pd.read_csv(StringIO(data), header=None)
  

Это то, что я получаю:

          0   1   2   3            4         5     6     7     8          9   
0  USNC3255  27  US  NC  LANDS   END  72305006  KNJM  KNCA  KNKT  T72305006   
1  USNC3256  27  US  NC    LANDSDOWN  72314058  KEHO  KAKH  KIPJ  T72314058   

     ...          13     14   15     16                17        18        19  
0    ...      NCZ095    NaN  545  28594  America/New_York  34.65266 -77.07661   
1    ...      NCZ068  sc007  517  28150  America/New_York  35.29374 -81.46537   

    20   21      22  
0    7  RDU  893727  
1  797  CLT  317845  

[2 rows x 23 columns]
  

Комментарии:

1. Спасибо, но, к сожалению, очистка исходного файла невозможна.

2. @prometheus2305 Почему бы и нет? Я не изменил содержимое исходного файла; они одинаковы на диске. Я изменил только то, что находится в памяти моей программы.

3. извините, я неправильно понял. Это сработало отлично, и я чувствую себя идиотом. Большое спасибо.