#python #pandas #text #type-conversion
#питон #панды #текст #преобразование типов
Вопрос:
Это небольшой пример больших данных.
У меня есть текстовый файл, подобный приведенному ниже.
Code: 44N
______________
Unit: m
Color: red
Length - Width - Height -
31 - 8 - 6 -
32 - 4 - 3 -
35 - 5 - 6 -
----------------------------------------
Code: 40N
______________
Unit: m
Color: blue
Length - Width - Height -
32 - 3 - 2 -
37 - 2 - 8 -
33 - 1 - 6 -
31 - 5 - 8 -
----------------------------------------
Code: 38N
Я хотел бы получить строки, содержащие текст, начинающийся с «Length», до строки, начинающейся с «—————————————-«. Я хотел бы делать это каждый раз, когда это происходит, а затем преобразовывать все эти новые данные в фрейм данных… может быть, добавить его в список фреймов данных.
В этом примере у меня должно быть два фрейма данных, подобных этим:
Length Width Height
31 8 6
32 4 3
35 5 6
Length Width Height
32 3 2
37 2 8
33 1 6
31 5 8
Я уже кое-что пробовал, но это сохраняет только один текст в списке, а не оба из них. И тогда я не знаю, как преобразовать их в фрейм данных.
file = open('test.txt', 'r')
file_str = file.read()
well_list = []
def find_between(data, first, last):
start = data.index(first)
end = data.index(last, start)
return data[start:end]
well_list.append(find_between(file_str, " Length", "----------------------------------------" ))
Кто-нибудь может мне помочь?
Ответ №1:
Эй, это показывает, как синтаксический анализ данных может быть сложным. Используйте .split()
метод off strings для выполнения задания. Вот способ сделать это.
import pandas as pd
import numpy as np
with open('test.txt', 'r') as f:
text = f.read()
data_start = 'Length - Width - Height'
data_end = '----------------------------------------'
# split the text in sections containing the data
sections = text.split(data_start)[1:]
# number of columns in the dataframe
col_names = data_start.split('-')
num_col = len(col_names)
for s in sections:
# remove everything after '------'
s = s.split(data_end)[0]
# now keep the numbers only
data = s.split()
# change string to int and discard '-'
data = [int(d) for d in data if d!='-']
# reshape the data (num_rows, num_cols)
data = np.array(data).reshape((int(len(data)/num_col), num_col))
df = pd.DataFrame(data, columns=col_names)
print(df)
Комментарии:
1. Отлично, мой друг. Большое вам спасибо!