我很难想出一个简单的解决方案来制作一个简单的数据框,以下面的格式处理文本:
Dose [Gy] Relative dose [%] Structure Volume [cm³]
0 0 45888.7
0.1 0.166667 27061.7
0.2 0.333333 18911.6
0.3 0.5 14907.6
0.4 0.666667 12602.7
0.5 0.833333 11127.8
0.6 1 10041.9
0.7 1.16667 9184.75
0.8 1.33333 8480.96
0.9 1.5 7885.19
1 1.66667 7382.82
1.1 1.83333 6947.77
1.2 2 6570.69
1.3 2.16667 6242.93
1.4 2.33333 5959.37
1.5 2.5 5713.12
1.6 2.66667 5497.12
1.7 2.83333 5305.86
1.8 3 5135.8
1.9 3.16667 4983.65
2 3.33333 4846.38
2.1 3.5 4720.5
2.2 3.66667 4604.54
2.3 3.83333 4496.7
2.4 4 4396.11
2.5 4.16667 4303.21
我正在做的是直接索引每一行的值,例如:
for line in lines:
value1 = line[10:20]
value3 = line[55:70]
然而,它不是非常pythonic,并且根本不健壮。
现在我正在努力让大熊猫做繁重的工作,并努力让数据正确地出来。例如:
df = pd.read_csv(StringIO.StringIO(data), sep=" ",engine='python')
哪些输出仍然包含新行“\ n”和“'”以及数字。
有更聪明的方法来解决这个问题吗?或者在熊猫可以使用之前我需要做很多预处理吗?
感谢您提供任何帮助/建议!
答案 0 :(得分:2)
我认为您需要分隔符s{2,}
- 2个或更多空格:
import pandas as pd
import numpy as np
from pandas.compat import StringIO
temp=u"""Dose [Gy] Relative dose [%] Structure Volume [cm³]
0 0 45888.7
0.1 0.166667 27061.7
0.2 0.333333 18911.6
0.3 0.5 14907.6
0.4 0.666667 12602.7
0.5 0.833333 11127.8
0.6 1 10041.9
0.7 1.16667 9184.75
0.8 1.33333 8480.96
0.9 1.5 7885.19
1 1.66667 7382.82
1.1 1.83333 6947.77
1.2 2 6570.69
1.3 2.16667 6242.93
1.4 2.33333 5959.37
1.5 2.5 5713.12
1.6 2.66667 5497.12
1.7 2.83333 5305.86
1.8 3 5135.8
1.9 3.16667 4983.65
2 3.33333 4846.38
2.1 3.5 4720.5
2.2 3.66667 4604.54
2.3 3.83333 4496.7
2.4 4 4396.11
2.5 4.16667 4303.21"""
#after testing replace StringIO(temp) to filename
df = pd.read_csv(StringIO(temp),sep=r'\s{2,}', engine='python')
print (df)
Dose [Gy] Relative dose [%] Structure Volume [cm³]
0 0.0 0.000000 45888.70
1 0.1 0.166667 27061.70
2 0.2 0.333333 18911.60
3 0.3 0.500000 14907.60
4 0.4 0.666667 12602.70
5 0.5 0.833333 11127.80
6 0.6 1.000000 10041.90
7 0.7 1.166670 9184.75
8 0.8 1.333330 8480.96
9 0.9 1.500000 7885.19
10 1.0 1.666670 7382.82
11 1.1 1.833330 6947.77
12 1.2 2.000000 6570.69
13 1.3 2.166670 6242.93
14 1.4 2.333330 5959.37
15 1.5 2.500000 5713.12
16 1.6 2.666670 5497.12
17 1.7 2.833330 5305.86
18 1.8 3.000000 5135.80
19 1.9 3.166670 4983.65
20 2.0 3.333330 4846.38
21 2.1 3.500000 4720.50
22 2.2 3.666670 4604.54
23 2.3 3.833330 4496.70
24 2.4 4.000000 4396.11
25 2.5 4.166670 4303.21
答案 1 :(得分:1)
使用read_fwf
,因为它是一个固定宽度的文件,并将列位置作为元组对列表传递:
In [63]:
t=""" Dose [Gy] Relative dose [%] Structure Volume [cm³]
0 0 45888.7
0.1 0.166667 27061.7
0.2 0.333333 18911.6
0.3 0.5 14907.6
0.4 0.666667 12602.7
0.5 0.833333 11127.8
0.6 1 10041.9
0.7 1.16667 9184.75
0.8 1.33333 8480.96
0.9 1.5 7885.19
1 1.66667 7382.82
1.1 1.83333 6947.77
1.2 2 6570.69
1.3 2.16667 6242.93
1.4 2.33333 5959.37
1.5 2.5 5713.12
1.6 2.66667 5497.12
1.7 2.83333 5305.86
1.8 3 5135.8
1.9 3.16667 4983.65
2 3.33333 4846.38
2.1 3.5 4720.5
2.2 3.66667 4604.54
2.3 3.83333 4496.7
2.4 4 4396.11
2.5 4.16667 4303.21"""
您可以看到最终的df格式正确:
df = pd.read_fwf(io.StringIO(t), colspecs=[(0,13),(14,33),(34,59)])
df
Out[63]:
Dose [Gy] Relative dose [%] Structure Volume [cm³]
0 0.0 0.000000 45888.70
1 0.1 0.166667 27061.70
2 0.2 0.333333 18911.60
3 0.3 0.500000 14907.60
4 0.4 0.666667 12602.70
5 0.5 0.833333 11127.80
6 0.6 1.000000 10041.90
7 0.7 1.166670 9184.75
8 0.8 1.333330 8480.96
9 0.9 1.500000 7885.19
10 1.0 1.666670 7382.82
11 1.1 1.833330 6947.77
12 1.2 2.000000 6570.69
13 1.3 2.166670 6242.93
14 1.4 2.333330 5959.37
15 1.5 2.500000 5713.12
16 1.6 2.666670 5497.12
17 1.7 2.833330 5305.86
18 1.8 3.000000 5135.80
19 1.9 3.166670 4983.65
20 2.0 3.333330 4846.38
21 2.1 3.500000 4720.50
22 2.2 3.666670 4604.54
23 2.3 3.833330 4496.70
24 2.4 4.000000 4396.11
25 2.5 4.166670 4303.21
答案 2 :(得分:0)
虽然其他解决方案可能更加pythonic,但我建议首先转换文件,使其不再包含多个空格。然后,您可以轻松地将其读入pandas数据帧:
import pandas as pd
infile = open('test.txt', 'r')
outfile = open('testout.txt', 'w')
for eachrow in infile:
stripped = '#'.join(filter(None,eachrow.split(' ')))
outfile.write(stripped)
infile.close()
outfile.close()
df = pd.read_csv('testout.txt', encoding = 'latin1', sep='#', engine='python')
df.head()