2017-05-03 6 views
2

나는 Pandas를 사용하여 추천인을 만들고 있으며, 10 억 개의 레코드와 같은 큰 csv 파일을로드해야합니다. 내 입력 파일은 다음과 같다 :색인 및 열을 제외한 Pandas read_csv dtype

P1 P2는 ...

1 1 0 ...

B 0 0 0 ...

C 0 0 케이 ... 1

400 열 근처에 k가 있습니다.

나는이 호출 내 파일을 읽으려고 :

내가 파일을 읽을
pd.read_csv(url,header=0, sep="\t",index_col=0,encoding="utf-8") 

는 팬더 잘못 내 데이터의 모든 숫자가 수레 것으로 추측. 로드 프로세스에서 훨씬 더 많은 공간을 절약하기 위해 데이터를 int 유형으로 만들려고합니다. 나는 옵션을 사용하려고 : dtype=int

을하지만,이 오류가 와서 :

ValueError: invalid literal for int() with base 10: 'a' 

나는이 내 인덱스 및 열 문자열 있다는 사실 때문이라고 생각한다.

열에 대한 데이터 유형을 수동으로 지정하기 위해 사전을 사용할 수는 있지만 권장 사항을 작성하기 때문에 열과 색인 파일을 미리 알 수 없으므로 사전에을 원합니다. 새 파일이 추가 될 때마다 사전을 다시 작성하지 않아야합니다.

read_csv 메서드를 으로 지정하면 색인 및 열 이름이 아닌 내 테이블의 데이터에만 정수 유형을 설정할 수 있습니까? (처럼) 데이터 유형 anyfuther 문제가있는 경우, 게시하시기 바랍니다

df = pd.read_csv(url,header=0, sep="\t",index_col=0,encoding="utf-8") 

def check_to_int(x): 
    try: 
     return int(x) 
    except: 
     return x 

for i in df.columns: 
    df[i] = df[i].apply(check_to_int) 

또는 메일로 연락 :

답변

0

당신은 dataframe 함께 작업 할 수있는 경우 INT 반환하는 다른 함수를 정의하는 데 적용 할 수 있습니다.

EDIT : 그렇다면 데이터 프레임 (또는 원하는 행)에서 첫 번째 행을 확인하여 플로트 (실제로 csv 모양이 어떻게되는지 알 수 없다는 사실을 알 수 있음)를 감지 할 수있을 것입니다.

|user_id |screen_name |isocode |location_name |location_prob 
0 |1058941868 |scottspur  |   |    | 
1 |1058941921 |Roxy22Bennett |   |    | 
2 |105894357 |MerrynPreece |GB   |United Kingdom |0.998043 

그래서 나는 '2'행 확인해야합니다 :

a = pd.read_csv('Result_Phong1.csv',header=0, encoding="utf-8", nrows = 3) 
a.fillna('', inplace=True) 

temp = [] 
for i in a.loc[2,:].index: 
    if type(a.loc[2,:][i]) == float: 
     temp.append(i) 

및 결과는 다음과 같습니다

Out[46]: [u'location_prob'] 

은 그럼 당신은의 딕셔너리를 생성 할 수 있습니다 나는이 dataframe이 read_csv 함수에서 전달합니다.

희망 하시겠습니까?

+0

메모리 사용으로 인해로드 된 Datafrane에 대한 기능을 사용하고 싶지 않습니다.단지 메모리 공간을 확보하기 위해 올바른 데이터 유형을 설정하기 위해 read_csv 메소드를 올바르게 구성하는 방법이 있는지 알고 싶습니다. 솔루션에서 전체 데이터 프레임을 float64로로드 한 다음 메모리에 복사본을 만든 다음 현재로서는 나에게 도움이되지 않습니다. 어쨌든 고마워요 –

+0

가능한 다른 해결책으로 수정합니다. –

관련 문제