我有这个人。数据作为python字符串,名为result:
= 382. ppm
SOIL LAYER NO
1 1 2 TOT
DEPTH(m) 0.01 1.24 1.52
BD 33kpa(t/m3) 1.60 1.60 1.60
SAND(%) 42.1 42.1 65.1
SILT(%) 37.9 37.9 16.9
CLAY(%) 20.0 20.0 18.0
ROCK(%) 12.0 12.0 12.0
WLS(kg/ha) 0.0 5.0 0.1 5.1
WLM(kg/ha) 0.0 5.0 0.1 5.1
WLSL(kg/ha) 0.0 4.0 0.1 4.1
WLSC(kg/ha) 0.0 2.1 0.0 2.1
WLMC(kg/ha) 0.0 2.1 0.0 2.1
WLSLC(kg/ha) 0.0 1.7 0.0 1.7
WLSLNC(kg/ha) 0.0 0.4 0.0 0.4
WBMC(kg/ha) 9.0 1102.1 250.9 1361.9
WHSC(kg/ha) 69. 8432. 1920. 10420.
WHPC(kg/ha) 146. 18018. 4102. 22266.
WOC(kg/ha) 224. 27556. 6272. 34.
WLSN(kg/ha) 0.0 0.0 0.0 0.0
WLMN(kg/ha) 0.0 0.2 0.0 0.2
WBMN(kg/ha) 0.9 110.2 25.1 136.2
WHSN(kg/ha) 7. 843. 192. 1042.
WHPN(kg/ha) 15. 1802. 410. 2227.
WON(kg/ha) 22. 2755. 627. 3405.
CFEM(kg/ha) 0.
2008 12 31
此处的每一行都是列表中的元素。我想将它转换为一个pandas数据帧,标题来自第3行,即1 1 2 TOT
,我想忽略最后一行,即2008 12 31
。这就是我现在正在做的事情:
last_line = len(result.split('\n'))
df = pandas.DataFrame(result.split('\n')[2:last_line-1])
如何分配列?如果我只得到标题为'TOT'的列
,也可以答案 0 :(得分:1)
字符串中有多个空格,因此我将所有空格替换为;
。然后使用函数read_csv
和参数skiprows=3
,它跳过前3行文件和names
,它们定义了列的名称。
import pandas
from StringIO import StringIO
pathToFile = 'test/file.txt'
f = open(pathToFile)
s = StringIO()
cur_ID = None
for ln in f:
#replace multiply spaces to one ;
ln = ';'.join(ln.split())
if ln.startswith('BD;'):
ln = ln.replace('BD;', 'BD ')
if (ln.startswith('19')) | (ln.startswith('20')):
continue;
s.write(ln + '\n')
s.seek(0)
df = pandas.read_csv(s, skiprows=3, sep=';', names=['0','1','2','3','TOT'])
print df
# 0 1 2 3 TOT
#0 DEPTH(m) 0.01 1.24 1.52 NaN
#1 BD 33kpa(t/m3) 1.60 1.60 1.60 NaN
#2 SAND(%) 42.10 42.10 65.10 NaN
#3 SILT(%) 37.90 37.90 16.90 NaN
#4 CLAY(%) 20.00 20.00 18.00 NaN
#5 ROCK(%) 12.00 12.00 12.00 NaN
#6 WLS(kg/ha) 0.00 5.00 0.10 5.1
#7 WLM(kg/ha) 0.00 5.00 0.10 5.1
#8 WLSL(kg/ha) 0.00 4.00 0.10 4.1
#9 WLSC(kg/ha) 0.00 2.10 0.00 2.1
#10 WLMC(kg/ha) 0.00 2.10 0.00 2.1
#11 WLSLC(kg/ha) 0.00 1.70 0.00 1.7
#12 WLSLNC(kg/ha) 0.00 0.40 0.00 0.4
#13 WBMC(kg/ha) 9.00 1102.10 250.90 1361.9
#14 WHSC(kg/ha) 69.00 8432.00 1920.00 10420.0
#15 WHPC(kg/ha) 146.00 18018.00 4102.00 22266.0
#16 WOC(kg/ha) 224.00 27556.00 6272.00 34.0
#17 WLSN(kg/ha) 0.00 0.00 0.00 0.0
#18 WLMN(kg/ha) 0.00 0.20 0.00 0.2
#19 WBMN(kg/ha) 0.90 110.20 25.10 136.2
#20 WHSN(kg/ha) 7.00 843.00 192.00 1042.0
#21 WHPN(kg/ha) 15.00 1802.00 410.00 2227.0
#22 WON(kg/ha) 22.00 2755.00 627.00 3405.0
#23 CFEM(kg/ha) 0.00 NaN NaN NaN
df = df.loc[:,'TOT']
print df
#0 NaN
#1 NaN
#2 NaN
#3 NaN
#4 NaN
#5 NaN
#6 5.1
#7 5.1
#8 4.1
#9 2.1
#10 2.1
#11 1.7
#12 0.4
#13 1361.9
#14 10420.0
#15 22266.0
#16 34.0
#17 0.0
#18 0.2
#19 136.2
#20 1042.0
#21 2227.0
#22 3405.0
#23 NaN
编辑:
如果文件中没有重复数据,并且列之间的空格更多为一个空格(则分隔符为\s\s+
):
import pandas as pd
#parse data to dataframe df
#sep - http://stackoverflow.com/a/1546245/2901002
df = pd.read_table('test/file.txt',
sep = '\s\s+',
skiprows = 3,
skip_footer = 1,
header=None,
index_col=[0],
engine = 'python',
names=['i','1','2','3','TOT']
)
print df
df = df['TOT']
print df