0

我使用的软件以以下方式将结果输出为文本 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。最理想的情况是,我想要这样的通缉格式或每个关节的单独的熊猫数据框或 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

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

4

1 回答 1

0

稍作修改的输出文本文件

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

粘贴到名为output.txtthis的文件中

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如果您想单独处理它们,该列表包含每个“关节”的一个 DataFrame。

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)
于 2020-11-03T15:04:13.057 回答