Как предварительно обрабатывать и загружать TSV-файл больших данных в фреймворк python?

В настоящее время я пытаюсь импортировать следующий большой файл с разделителями-разделителями в структуру, подобную dataframe, в Python. Естественно, я использую dataframe pandas , хотя я открыт для других вариантов.

Этот файл имеет размер в несколько Гбайт и не является стандартным файлом tsv – он сломан, т. Е. Строки имеют различное количество столбцов. Одна строка может содержать 25 столбцов, другая – 21.

Вот пример данных:

 Col_01: 14 .... Col_20: 25 Col_21: 23432 Col_22: 639142 Col_01: 8 .... Col_20: 25 Col_22: 25134 Col_23: 243344 Col_01: 17 .... Col_21: 75 Col_23: 79876 Col_25: 634534 Col_22: 5 Col_24: 73453 Col_01: 19 .... Col_20: 25 Col_21: 32425 Col_23: 989423 Col_01: 12 .... Col_20: 25 Col_21: 23424 Col_22: 342421 Col_23: 7 Col_24: 13424 Col_25: 67 Col_01: 3 .... Col_20: 95 Col_21: 32121 Col_25: 111231 

Как вы можете видеть, некоторые из этих столбцов находятся не в правильном порядке …

Теперь я считаю, что правильный способ импорта этого файла в фреймворк данных состоит в том, чтобы предварительно обработать данные, чтобы вы могли выводить данные с помощью значений NaN , например

 Col_01 .... Col_20 Col_21 Col22 Col23 Col24 Col25 8 .... 25 NaN 25134 243344 NaN NaN 17 .... NaN 75 2 79876 73453 634534 19 .... 25 32425 NaN 989423 NaN NaN 12 .... 25 23424 342421 7 13424 67 3 .... 95 32121 NaN NaN NaN 111231 

Чтобы сделать это еще более сложным, это очень большой файл размером в несколько ГБ.

Обычно я пытаюсь обрабатывать данные в кусках, например

 import pandas as pd for chunk in pd.read_table(FILE_PATH, header=None, sep='\t', chunksize=10**6): # place chunks into a dataframe or HDF 

Однако я не вижу возможности «предварительно обработать» данные сначала кусками, а затем использовать куски для чтения данных в pandas.read_table() . Как бы вы это сделали? Какие средства предварительной обработки доступны – возможно, sed ? awk ?

Это сложная проблема из-за размера данных и форматирования, которые необходимо выполнить перед загрузкой в ​​dataframe. Любая помощь оценивается.

3 Solutions collect form web for “Как предварительно обрабатывать и загружать TSV-файл больших данных в фреймворк python?”

 $ cat > pandas.awk BEGIN { PROCINFO["sorted_in"]="@ind_str_asc" # traversal order for for(i in a) } NR==1 { # the header cols is in the beginning of data file # FORGET THIS: header cols from another file replace NR==1 with NR==FNR and see * below split($0,a," ") # mkheader a[1]=first_col ... for(i in a) { # replace with a[first_col]="" ... a[a[i]] printf "%6s%s", a[i], OFS # output the header delete a[i] # remove a[1], a[2], ... } # next # FORGET THIS * next here if cols from another file UNTESTED } { gsub(/: /,"=") # replace key-value separator ": " with "=" split($0,b,FS) # split record from "," for(i in b) { split(b[i],c,"=") # split key=value to c[1]=key, c[2]=value b[c[1]]=c[2] # b[key]=value } for(i in a) # go thru headers in a[] and printf from b[] printf "%6s%s", (i in b?b[i]:"NaN"), OFS; print "" } 

Образец данных ( pandas.txt ):

 Col_01 Col_20 Col_21 Col_22 Col_23 Col_25 Col_01: 14 Col_20: 25 Col_21: 23432 Col_22: 639142 Col_01: 8 Col_20: 25 Col_22: 25134 Col_23: 243344 Col_01: 17 Col_21: 75 Col_23: 79876 Col_25: 634534 Col_22: 5 Col_24: 73453 Col_01: 19 Col_20: 25 Col_21: 32425 Col_23: 989423 Col_01: 12 Col_20: 25 Col_21: 23424 Col_22: 342421 Col_23: 7 Col_24: 13424 Col_25: 67 Col_01: 3 Col_20: 95 Col_21: 32121 Col_25: 111231 $ awk -f pandas.awk -pandas.txt Col_01 Col_20 Col_21 Col_22 Col_23 Col_25 14 25 23432 639142 NaN NaN 8 25 NaN 25134 243344 NaN 17 NaN 75 5 79876 634534 19 25 32425 NaN 989423 NaN 12 25 23424 342421 7 67 3 95 32121 NaN NaN 111231 

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

Если вы читаете заголовки из другого файла ( cols.txt ), чем файл данных ( pandas.txt ), выполните скрипт ( pandas.awk ):

 $ awk -F pandas.awk cols.txt pandas.txt 

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

 awk -f pandas2.awk pandas.txt # first record as header awk -f pandas2.awk cols.txt pandas.txt # first record from cols.txt awk -v cols="cols.txt" -f pandas2.awk pandas.txt # read cols from cols.txt 

Или даже:

 awk -v cols="pandas.txt" -f pandas2.awk pandas.txt # separates keys from pandas.txt for header 

Код:

 $ cat > pandas2.awk BEGIN { PROCINFO["sorted_in"]="@ind_str_asc" # traversal order for for(i in a) if(cols) { # if -v cols="column_file.txt" or even "pandas.txt" while ((getline line< cols)>0) { # read it in line by line gsub(/: [^ ]+/,"",line) # remove values from "key: value" split(line,a) # split to temp array for(i in a) # collect keys to column array col[a[i]] } for(i in col) # output columns printf "%6s%s", i, OFS print "" } } NR==1 && cols=="" { # if the header cols are in the beginning of data file # if not, -v cols="column_file.txt" split($0,a," +") # split header record by spaces for(i in a) { col[a[i]] # set them to array col printf "%6s%s", a[i], OFS # output the header } print "" } NR==1 { next } { gsub(/: /,"=") # replace key-value separator ": " with "=" split($0,b,FS) # split record from separator FS for(i in b) { split(b[i],c,"=") # split key=value to c[1]=key, c[2]=value b[c[1]]=c[2] # b[key]=value } for(i in col) # go thru headers in col[] and printf from b[] printf "%6s%s", (i in b?b[i]:"NaN"), OFS; print "" } 

Вы можете сделать это более чисто полностью в Пандах.

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

 >>> df1 AB 0 1 2 >>> df2 BC 1 3 4 

Вы можете использовать .concat, чтобы объединить их вместе:

 >>> pd.concat([df1, df2]) ABC 0 1 2 NaN 1 NaN 3 4 

Вы можете увидеть, что NaN создается для значений строк, которые не существуют.

Это может быть легко применено к вашим данным примера без предварительной обработки:

 import pandas as pd df=pd.DataFrame() with open(fn) as f_in: for i, line in enumerate(f_in): line_data=pd.DataFrame({k.strip():v.strip() for k,_,v in (e.partition(':') for e in line.split('\t'))}, index=[i]) df=pd.concat([df, line_data]) >>> df Col_01 Col_20 Col_21 Col_22 Col_23 Col_24 Col_25 0 14 25 23432 639142 NaN NaN NaN 1 8 25 NaN 25134 243344 NaN NaN 2 17 NaN 75 5 79876 73453 634534 3 19 25 32425 NaN 989423 NaN NaN 4 12 25 23424 342421 7 13424 67 5 3 95 32121 NaN NaN NaN 111231 

В качестве альтернативы, если ваша основная проблема заключается в установлении желаемого порядка столбцов в многократном добавлении столбцов, просто сначала прочитайте все значения столбца (не проверены):

 # based on the alpha numeric sort of the example of: # [ALPHA]_[NUM] headers=set() with open(fn) as f: for line in f: for record in line.split('\t'): head,_,datum=record.partition(":") headers.add(head) # sort as you wish: cols=sorted(headers, key=lambda e: int(e.partition('_')[2])) 

Pandas будет использовать порядок списка для порядка столбцов, если он задан при первоначальном создании DataFrame.

  • Сравните 2 файла и удалите любые строки в файле2, когда они соответствуют значениям, найденным в файле1
  • Команда sed запускается с использованием os.system () или subprocess.call () оставляет файл csv без разделителя
  • Несоответствие между регулярными выражениями sed и python
  • Как обрабатывать огромные текстовые файлы, содержащие символы EOF / Ctrl-Z, используя Python в Windows?
  • обрезать большой файл журнала
  • Как сказать python не интерпретировать хеш-символ как комментарий?
  • Python или awk / sed для очистки данных
  • удаление расширений в подкаталогах
  •  
    Interesting Posts for Van-Lav

    Возвращать текстовую строку из физических координат в PDF с помощью Python

    Split pandas dataframe by String

    Как ссылаться на дочерний элемент из нескольких отношений в SQLAlchemy?

    Почему я получаю ImportError: нет модуля с именем pip 'сразу после установки pip?

    Можно ли запросить QQbject PyQt4, чтобы определить, был ли поврежден основной экземпляр C ++?

    невозможно создать новый канал в javascript API канала

    Как я могу работать с файлами Gzip, которые содержат дополнительные данные?

    Обновление python в virtualenv

    использовать существующее поле как _id, используя elasticsearch dsl python DocType

    Использование pcolor для построения 3 массивов в python

    Доступ .NET к 802.15.4 Беспроводному приемопередатчику

    В чем причина ошибочного запроса при отправке формы в приложение «Колба»?

    Почему мой формат python% s не занимает места?

    Python: возврат к основному поведению __str__

    Запрос SPARQL дает неожиданный результат

    Python - лучший язык программирования в мире.