2016-11-17 70 views
1

我正在運行Python 3.5.2和Pandas 0.19.1。我使用read_fwf()來讀取最初在FORTRAN中格式化的大型數據文件。它看起來像這樣的列:熊貓read_fwf忽略值

SiC4+ e- C2  c-SiC2  1.500e-07 -5.000e-01 0.000e+00 2.00e+00 0.00e+00 logn 8  10 280 3 746 1 1 
SiC4+ e- C  l-SiC3  1.500e-07 -5.000e-01 0.000e+00 2.00e+00 0.00e+00 logn 8  10 280 3 747 1 1 
O  e- O-    1.500e-15 0.000e+00 0.000e+00 2.00e+00 0.00e+00 logn 8  10 280 3 744 1 1 
S  e- S-    5.000e-15 0.000e+00 0.000e+00 2.00e+00 0.00e+00 logn 8  10 280 3 745 1 1 

要讀這,我使用此代碼:

convert = lambda x: int(species[x]) if x!='' else None 
reactions = pd.read_fwf('data.dat',sep='\s+',converters{0:convert,1:convert,2:convert,3:convert}) 
reactions.fillna(0,inplace=True) 

該轉換器把前4列化學名稱和其索引編號替換它們(來自另一個文件),並且任何丟失的數據都被索引號0替換。這工作正常。

什麼不行的是第6列和第15列。

116  76  7  30 1.500000e-07 0.5 0.0 2.0 0.0 logn 8 10 280  3 46 1 1 
116  76  1  41 1.500000e-07 0.5 0.0 2.0 0.0 logn 8 10 280  3 47 1 1 
    4  76  74  0 1.500000e-15 0.0 0.0 2.0 0.0 logn 8 10 280  3 44 1 1 
    5  76  75  0 5.000000e-15 0.0 0.0 2.0 0.0 logn 8 10 280  3 45 1 1 

這是怎麼回事?第6列失去負號,第15列失去領先的'7'。我找不到爲什麼發生這種情況的原因,而且沒有任何意義。文件中帶有負號的其他列保持不變。

更新

下面的解決方案是不是不正確,但它爲我工作需要對文件頭一個非常重要的變化。我的文件的第7列看起來像這樣(有頭):

Input1 Input2 Output1 Output2 alpha  beta  gamma  
NC3  CRP  C2   CN   2.000e+03 0.000e+00 0.000e+00 
C2N2  CRP  CN   CN   2.000e+03 0.000e+00 0.000e+00 
NC7  CRP  C6   CN   2.000e+03 -1.000e+00 0.000e+00 

read_fwf()讀頁眉和中之間的空間,並且必須假定列標測試版本是間隔從2點月底的字符掉標記爲alpha的列,完全忽略了beta中某些值的負號。

我改變了所有列的標題位置,這可能是一個問題,並且問題已修復。

Input1 Input2 Output1 Output2 alpha  beta  gamma  
NC3  CRP  C2   CN   2.000e+03 0.000e+00 0.000e+00 
C2N2  CRP  CN   CN   2.000e+03 0.000e+00 0.000e+00 
NC7  CRP  C6   CN   2.000e+03 -1.000e+00 0.000e+00 

請注意,beta(和gamma)的文件頭被拉到一個空間左側。這足夠早地啓動該列以便read_fwf()包括負號。

+2

MaxU的答案是好的,但只是一個快速評論:用'九月='你給一個分離器,但read_fwf'的'的一點是,你有一列有序的文件,而不是分隔符組織的文件。所以我認爲你不想把'read_fwf'和'sep ='參數結合起來。如果你想使用分隔符,只需使用'read_csv' – JohnE

+0

從來沒有想到'sep ='會是問題所在。我認爲它是良性的,因爲它被包含在'read_fwf()'的文檔中。 – SteelAngel

回答

2

UPDATE:

假設你有以下文件:

Input1 Input2 Output1 Output2 alpha  beta  gamma  
NC3  CRP  C2   CN   2.000e+03 0.000e+00 0.000e+00 
C2N2  CRP     CN   2.000e+03 0.000e+00 0.000e+00 
NC7    C6   CN   2.000e+03 -1.000e+00 0.000e+00 

解決方案:爲更新問題溶液(fn - 是該文件的完整路徑)

In [164]: df = pd.read_fwf(fn, header=None, skiprows=1) 

In [165]: df.columns = pd.read_csv(fn, delim_whitespace=True, nrows=1).columns 

In [166]: df 
Out[166]: 
    Input1 Input2 Output1 Output2 alpha beta gamma 
0 NC3 CRP  C2  CN 2000.0 0.0 0.0 
1 C2N2 CRP  NaN  CN 2000.0 0.0 0.0 
2 NC7 NaN  C6  CN 2000.0 -1.0 0.0 

老回答:

試試這個:

In [63]: fn = r'D:\temp\.data\1.fwf' 

In [64]: df = pd.read_fwf(fn, header=None) 

In [65]: df 
Out[65]: 
     0 1 2  3    4 5 6 7 8  9 10 11 12 13 14 15 16 
0 SiC4+ e- C2 c-SiC2 1.500000e-07 -0.5 0.0 2.0 0.0 logn 8 10 280 3 746 1 1 
1 SiC4+ e- C l-SiC3 1.500000e-07 -0.5 0.0 2.0 0.0 logn 8 10 280 3 747 1 1 
2  O e- O-  NaN 1.500000e-15 0.0 0.0 2.0 0.0 logn 8 10 280 3 744 1 1 
3  S e- S-  NaN 5.000000e-15 0.0 0.0 2.0 0.0 logn 8 10 280 3 745 1 1 
+0

快速更新: – SteelAngel

+0

@SteelAngel,請參閱UPDATE – MaxU