将特定于软件的文本文件数据读入 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 2
被Parameter2
代替了。所以问题是: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)
我使用的一个软件将结果输出为文本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 2
被Parameter2
代替了。所以问题是: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)