2013-08-27 9 views
6

나는 탭으로 파일을 문자열로 해석해야하는 열로 구분하지만 많은 항목이 정수입니다. 작은 파일이 read_csv 제대로 있지만 큰 파일이 나던 작품에, 일부 비 정수 값을보고 난 후에 문자열로 열을 해석 :pandas read_csv dtype 추론 문제

import pandas as pd 
df = pd.DataFrame({'a':['1']*100000 + ['X']*100000 + ['1']*100000, 'b':['b']*300000}) 
df.to_csv('test', sep='\t', index=False, na_rep='NA') 
df2 = pd.read_csv('test', sep='\t') 
print df2['a'].unique() 
for a in df2['a'][262140:262150]: 
    print repr(a) 

출력 :

['1' 'X' 1] 
'1' 
'1' 
'1' 
'1' 
1 
1 
1 
1 
1 
1 

흥미롭게 262144 2의 힘 추측과 변환은 청크에서 발생하지만 일부 청크는 건너 뛰고 있다고 생각합니다. 문제가 해결되지 읽기와 쓰기를 위해 = csv.QUOTE_NONNUMERIC 을 인용 를 추가하지만

나는,이 버그이지만, 그 주위에 일이 아마도 인용 사용하려는 매우 확신합니다. 이상하게도 필자는 문자열 데이터를 인용하여이 문제를 해결하고 팬더가 인용 된 데이터를 추론하지 않도록 할 수 있습니다.

사용 팬더 0.12.0

당신은 여기 read_csv 파서를 속였다 한
+2

[docs] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html)는 다음과 같이 동작합니다 :'pd.read_csv (' 테스트 ', sep ='\ t ', 변환기 = {'a ': str})'. –

+0

@StevenRumbalski 그리고 그것은 완전히 않습니다! 답변으로 추가해야합니다! –

+0

@AndyHayden : 감사합니다. –

답변

5

(그리고 공정하게, 내가 제대로 상관없이 당신이 그것을 던져 무엇을 항상이 출력으로 예상 할 수 있다고 생각하지 않습니다) ... 그렇습니다. a bug 일 수 있습니다!

In [11]: df2['a'] = df2['a'].astype('str') 

# now they are equal 
In [12]: pd.util.testing.assert_frame_equal(df, df2) 

: 파일에서 읽은 후이를 패치

df2 = pd.read_csv('test', sep='\t', converters={'a': str}) 

게으른 솔루션은 그냥 :

으로 @Steven는 read_csv의 컨버터 인수를 사용할 수 있습니다 지적 참고 : 데이터 프레임을 저장하는 솔루션을 찾고있는 경우 세션 사이에서 pickle과 HDF5Store는 이러한 유형의 구문 분석 버그의 영향을받지 않는 뛰어난 솔루션입니다 (상당히 빨라집니다). 참조 : How to store data frame using PANDAS, Python

+0

이것은 내 후반이지만, 피하려고하는 파일을 읽을 때마다 여분의 코드 라인이 포함됩니다. – andrew

+0

솔루션은 아마도 to_csv/read_csv를 사용하여 DataFrames, to_pickle 또는 hdf5_store를 저장하지 않는 것이 훨씬 더 좋은 솔루션입니다 이런 종류의 파싱 버그의 영향을받습니다). –

+0

@ user1068490 –

6

이 팬더는 데이터 유형을 추론하는 것을 방지하기 위해, read_csvconverters 인수를 제공

converters을 : 딕셔너리를. 선택 사항

특정 열의 값을 변환하는 함수의 사전. 워드 프로세서의

df2 = pd.read_csv('test', sep='\t', converters={'a':str}) 

내 독서는 모든 컬럼에 대해 컨버터를 지정할 필요가 없다는 것입니다 : 키이의 모습 정수 또는 파일의 경우

열 레이블이 될 수 있습니다. Pandas는 계속 지정되지 않은 열의 데이터 유형을 추론해야합니다.

관련 문제