2016-11-17 4 views
1

저는 파이썬 3.5.2와 팬더 0.19.1을 사용하고 있습니다. 나는 read_fwf()을 사용하여 원래 FORTRAN으로 포맷 된 큰 데이터 파일을 읽습니다.팬더 read_fwf 값 무시

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 열 '화학 이름을 가지고 인덱스 번호로 대체 :

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 

는이 코드를 사용하고,이를 읽으려면 : 그것은 다음과 같이 열이 (다른 파일에서) 누락 된 데이터는 인덱스 번호 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 개 문자 멀리 끝에서 간격 된 것으로 추정해야합니다 베타의 일부 값에서 음수 부호를 완전히 무시하고 알파로 표시된 열의

모든 열의 헤더 위치가 변경되어 문제가 될 수 있으며 문제가 해결되었습니다.

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

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 

OLD 대답 :

이 시도 :

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