Чтение данных текстового файла программного обеспечения в фреймворк pandas

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

или как здесь например:

------------------------------------
Joint 1
------------------------------------
Time    Parameter1  Parameter 2
16.000  1174    7.45
17.000  1174    7.87
18.000  1174    7.64
------------------------------------
Joint 2
------------------------------------
Time    Parameter1  Parameter 2
16.000  1174    7.45
17.000  1154    7.87
18.000  1124    7.64
------------------------------------
Joint 3
------------------------------------
Time    Parameter1  Parameter 2
16.000  1174    7.55
17.000  1174    7.67
18.000  1174    7.84

Теперь я хочу проанализировать результаты для каждого сустава и не знаю, как импортировать текстовый файл в pandas возможным способом. Оптимально мне нужно что-то вроде этого Wanted Format или отдельный фрейм данных pandas или массив / список numpy для каждого стыка. Как здесь, например:

Joint 1                 Joint 2                 Joint 3
Time    Parameter1  Parameter 2 Time    Parameter1  Parameter 2 Time    Parameter1  Parameter 2
16.000  1174    7.45            16.000  1174    7.45            16.000  1174    7.55
17.000  1174    7.87            17.000  1154    7.87            17.000  1174    7.67
18.000  1174    7.64            18.000  1124    7.64            18.000  1174    7.84

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


person OmarShehataUBW    schedule 03.11.2020    source источник
comment
Добро пожаловать в SO! Не могли бы вы предоставить MRE, который делает создание ответа намного более эффективным (Как создать минимальный воспроизводимый пример.   -  person Timus    schedule 03.11.2020
comment
@ Тимус: спасибо за подсказку. Я уже добавил пример вывода и пример желаемого результата :)   -  person OmarShehataUBW    schedule 03.11.2020
comment
Но только в виде изображений - это не так, как должно быть. Пользователи должны иметь возможность вырезать и вставлять. Это не должно быть проблемой для вашего выходного текстового файла?   -  person Timus    schedule 03.11.2020
comment
@Timus: Еще раз спасибо за ваше предложение. Я отредактировал вопрос :)   -  person OmarShehataUBW    schedule 03.11.2020


Ответы (1)


Со слегка измененным текстовым файлом вывода

------------------------------------
Joint 1
------------------------------------
Time    Parameter1  Parameter2
16.000  1174    7.45
17.000  1174    7.87
18.000  1174    7.64
...

вставлен в файл с именем output.txt это

import pandas as pd
from io import StringIO

dfs = []
with open('ouput.txt', 'r') as file:
    next(file)
    for line in file:
        joint = line.strip()
        next(file)
        df_str = ''
        for line in file:
            if line.startswith('--'):
                break
            df_str += line
        df = pd.read_csv(StringIO(df_str), delim_whitespace=True)
        df.columns = pd.MultiIndex.from_product([[joint], df.columns])
        dfs.append(df)

df = pd.concat(dfs, axis=1)

производит следующий вывод (print(df))

  Joint 1                        ... Joint 3                      
     Time Parameter1 Parameter2  ...    Time Parameter1 Parameter2
0    16.0       1174       7.45  ...    16.0       1174       7.55
1    17.0       1174       7.87  ...    17.0       1174       7.67
2    18.0       1174       7.64  ...    18.0       1174       7.84

[3 rows x 9 columns]

по крайней мере для меня. (Этот материал немного непостоянен, точное форматирование файла довольно важно.) Список dfs содержит по одному DataFrames для каждого соединения, если вы предпочитаете работать с ними индивидуально.

Если вас больше интересует вертикальное расположение с Time как частью индекса, тогда замена

...
        df = pd.read_csv(StringIO(df_str), delim_whitespace=True, index_col=0)
        df.index = pd.MultiIndex.from_product([[joint], df.index])
...
df = pd.concat(dfs, axis=0)

производит

              Parameter1  Parameter2
        Time                        
Joint 1 16.0        1174        7.45
        17.0        1174        7.87
        18.0        1174        7.64
Joint 2 16.0        1174        7.45
        17.0        1154        7.87
        18.0        1124        7.64
Joint 3 16.0        1174        7.55
        17.0        1174        7.67
        18.0        1174        7.84

Разница в файле заключается в том, что Parameter 2 заменяется на Parameter2. Возникает вопрос: возможны ли пробелы в названиях заголовков? Если так, все становится сложнее.

Принимая вашу идею в комментарии, это также должно сработать:

# Extracting the column names (could also be done manually)
with open('ouput.txt') as fin:
    for _ in range(3):
        next(fin)
    columns = ['Joint'] + next(fin).split()

# Transforming file into a csv-file (ignoring the header lines)
with open('ouput.txt', 'r') as fin, open('ouput-tidy.csv', 'w') as fout:
    next(fin)
    for line in fin:
        joint = line.strip()
        next(fin)
        next(fin)
        for line in fin:
            if line.startswith('--'):
                break
            fout.write(','.join([joint] + line.split()) + '\n')

# Reading csv-file in DataFrame
df = pd.read_csv('ouput-tidy.csv', header=None)
df.columns = columns
df.set_index(['Joint', 'Time'], drop=True, inplace=True)
person Timus    schedule 03.11.2020
comment
Третье и большое спасибо. Все действительно сработало, но да, у меня проблемы с именами параметров. Хотя это не большая проблема. Но, похоже, требуется много времени, когда я запускаю это в текстовом файле с 4000 строками. Как вы думаете, лучше сначала изменить формат текстового файла - ›сохранить его в обновленном формате данных как другой текстовый файл, а затем импортировать приведенный в порядок текстовый файл прямо в pandas? - person OmarShehataUBW; 04.11.2020
comment
@OmarShehataUBW Да, это может быть хорошей идеей! Я добавил предложение, как это можно сделать (здесь, для образца кадра). - person Timus; 04.11.2020