2016-11-17 34 views
1

私はPython 3.5.2とPandas 0.19.1を実行しています。私はread_fwf()を使用して、元々FORTRANでフォーマットされた大きなデータファイルを読み込みます。それは次のようになりの列があります。これを読み込むために値を無視しているPandas 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」を欠いている。私はなぜこれが起こっているの理由を見つけることができない、それは意味をなさない。ファイル内の他の列には、先行する負の符号が付いています。

アップデートは

以下のソリューション間違っていないですが、それは私のために働くためにファイルヘッダに非常に重要な変更が必要でした。

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つの文字離れて端から間隔を置いて配置されたものと推定している必要があります:私のファイルの最初の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 

ベータ(およびガンマ)のファイルヘッダーが1つ左に引かれていることに注目してください。これにより、負の符号を含めるには、早めに列が開始され、read_fwf()になります。

+2

MaxUの答えは良いが、ただ速いコメントです: '9月='あなたは、セパレータが、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、更新を参照してください – MaxU

関連する問題