Как разделить текст между определенными строками, а затем преобразовать его в dataframe?

#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. Отлично, мой друг. Большое вам спасибо!