将列分配给由字符串构造的pandas数据帧

时间:2015-11-19 22:59:18

标签: python pandas

我有这个人。数据作为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'的列

,也可以

1 个答案:

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