Python: Pandas, работа с разделенными именами столбцов

#python #python-3.x #pandas #text

#python #python-3.x #pandas #текст

Вопрос:

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

Как бы я мог превратить это в фрейм данных pandas? Я пробовал использовать pd.read_table('file.txt', delim_whitespace = True, skiprows = 14) , но у него были всевозможные проблемы. Мои проблемы таковы…

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

Столбцы «stat ( /-)» и «syst ( /-)» отображаются как 4 столбца из-за пробела.

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

Любая помощь очень важна, я просто не совсем уверен, с чего начать после того, как прочитаю файл с помощью pandas.

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

1. Последний фунт — это проблема с убийством. Не передавайте имя файла pandas: откройте файловый объект и считывайте, пока не найдете последнюю строку с фунтом, найдите указатель файла на это местоположение, затем используйте read_fwf, указав размер, который вы можете найти в первой части данных, которые вы также прочитали в этом процессе

2. Как мне прочитать его до последней строки pound?

Ответ №1:

Рассмотрите возможность чтения в необработанном файле, очистки его построчно при записи в новый файл с помощью csv модуля. Регулярное выражение используется для идентификации заголовков столбцов с использованием i в качестве критерия соответствия. Ниже предполагается, что столбцы разделены более чем одним пробелом:

 import os
import csv, re
import pandas as pd

rawfile = "path/To/RawText.txt"
tempfile = "path/To/TempText.txt"

with open(tempfile, 'w', newline='') as output_file:
    writer = csv.writer(output_file)    

    with open(rawfile, 'r') as data_file:
        for line in data_file:            
            if re.match('^.*i', line):                     # KEEP COLUMN HEADER ROW
                line = line.replace('n', '')                
                row = line.split("  ")                
                writer.writerow(row)

            elif line.startswith('#') == False:            # REMOVE HASHTAG LINES
                line = line.replace('n', '')
                row = line.split("  ")            
                writer.writerow(row)

df = pd.read_csv(tempfile)                                 # IMPORT TEMP  FILE
df.columns = [c.replace('# ', '') for c in df.columns]     # REMOVE '#' IN COL NAMES     

os.remove(tempfile)                                        # DELETE TEMP FILE
  

Ответ №2:

Это способ, о котором я упоминаю в комментарии: он использует объект file, чтобы пропустить пользовательские грязные данные, которые вам нужно пропустить в начале. Вы помещаете смещение файла в соответствующее место в файле, где read_fwf просто выполняется задание:

 with open(rawfile, 'r') as data_file:
    while(data_file.read(1)=='#'):
        last_pound_pos = data_file.tell()
        data_file.readline()
    data_file.seek(last_pound_pos)
    df = pd.read_fwf(data_file)

df
Out[88]: 
   i      mult  stat ( /-)  syst ( /-)        Q2         x       x.1       Php
0  0  0.322541    0.018731    0.026681  1.250269  0.037525  0.148981  0.104192
1  1  0.667686    0.023593    0.033163  1.250269  0.037525  0.150414  0.211203
2  2  0.766044    0.022712    0.037836  1.250269  0.037525  0.149641  0.316589
3  3  0.668402    0.024219    0.031938  1.250269  0.037525  0.148027  0.415451
4  4  0.423496    0.020548    0.018001  1.250269  0.037525  0.154227  0.557743
5  5  0.237175    0.023561    0.007481  1.250269  0.037525  0.159904  0.750544
  

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

1. Большое вам спасибо! Знаете ли вы, в любом случае, я мог бы расширить это на . СПИСОК файлов?