Как отделить определенные строки от текста и добавить их в качестве имен столбцов? - PullRequest
0 голосов
/ 06 ноября 2019

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

Итак, представьте, что у меня есть текстовый файл, подобный этому:

'''
Useless information 1
Useless information 2
Useless information 3
Measurement:
Len. (cm)   :length of the object
Hei. (cm)   :height of the object
Tp.         :type of the object
~A DATA
10  5   2
8   7   2
5   6   1
9   9   1
'''

, и я хотел быпоместите значения ниже '~ A DATA' в качестве DataFrame. Мне уже удалось получить DataFrame без имен столбцов (хотя он немного запутался, поскольку в моем коде есть бессмысленные строки), как вы можете видеть:

with open(r'C:\Users\Lucas\Desktop\...\text.txt') as file:
    for line in file:
        if line.startswith('~A'):
           measures = line.split()[len(line):]
           break

    df = pd.read_csv(file, names=measures, sep='~A', engine='python')

newdf = df[0].str.split(expand = True)

newdf()
    0  1  2
0  10  5  2
1   8  7  2
2   5  6  1
3   9  9  1

Теперь я хотел бы поставить 'Len''Hei' и 'Tp' из текста в качестве имен столбцов в DataFrame. Только эти коды измерений (без последовательных строк). Как я могу сделать это, чтобы иметь df, как это?

    Len  Hei  Tp
  0  10   5   2
  1   8   7   2
  2   5   6   1
  3   9   9   1

Одним из решений было бы разделить каждую строку ниже строки «Измерение» (или начиная со строки «Лен ...»)до каждой строки над строкой «~ A» (или заканчивающейся строкой «Tp»). И затем разбить каждую строку, которую мы получили. Но я не знаю, как это сделать.

1 Ответ

2 голосов
/ 06 ноября 2019

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

Чтобы ответить на конкретный вопрос, который вы задали, предположим, что переменная line содержит одну из строк, скажем line = Len. (cm) :length of the object, вы можете выполнить разбиение на основе регулярных выражений, при котором вы разбиваете любой специальный символ, кроме цифри алфавиты.

import re
splited_line = re.split(r"[^a-zA-Z0-9]", line) #add other characters which you don't want
print(splited_line)

Это приводит к

['Len', ' ', 'cm', '   ', 'length of the object']

Далее, чтобы получить имя столбца, вы выбираете первый элемент из списка как splited_line[0]

Решение 2: Если вы уже знаете имена столбцов, вы можете просто набрать

df.columns = ['Len','Hei','Tp']

Вот полное решение для того, что вы ищете:

In [34]: f = open('text.txt', "rb") 
    ...: flag = False 
    ...: column_names = [] 
    ...: for line in f: 
    ...:     splited_line = re.split(r"[^a-zA-Z0-9~]", line.decode('utf-8')) 
    ...:     if splited_line[0] == "Measurement": 
    ...:         flag = True 
    ...:         continue 
    ...:     elif splited_line[0] == "~A": 
    ...:         flag = False 
    ...:     if flag == True: 
    ...:         column_names.append(splited_line[0]) 
...