将特定于软件的文本文件数据读入 pandas 数据帧

Reading software-specific text file data into pandas dataframe

我使用的一个软件将结果输出为文本txt文件,格式如下Output Text File。

或者像这里一样:

------------------------------------
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

如果有人可以帮助处理输出文本文件的连字符换行符,那就太好了。

稍作修改后的输出文本文件

------------------------------------
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 包含每个“关节”的一个数据帧,如果您想单独处理它们的话。

如果您对将 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 2Parameter2代替了。所以问题是:header 名称中的空格是否可能?如果是这样,事情就变得更复杂了。

在评论中采纳你的想法这也应该有效:

# 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)