2015-11-19 22 views
1

我有這個foll。數據作爲一個Python字符串名爲結果:將列分配給由字符串構造的熊貓數據框

= 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  

這裏每行都是在列表中的元素。我想把它轉換成一個熊貓數據幀,頭部來自第三行,即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

字符串中有多個空格,所以我將它們全部替換爲;。然後使用帶參數skiprows=3的函數read_csv,該參數跳過前三行文件和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 
相關問題