2017-09-13 5 views
1

나는 다음과 같은 희소 데이터의 179기가바이트 있습니다는 위도 긴 범위에 따라 행과 필터에서 읽을 CSV DictReader을 사용

id lat long var1 var2 var3 
1  52.1 0.07 A  
2  58.3 5.78   C 
3  46.5 -8.32     E 

나는 데이터를 읽고 싶어하고, 필터 그 정도 특정 사이에만 행 위도가 긴 좌표가 유지됩니다. 이 reprex에서 위도의 예 범위는 59.0-51.0이며, 경도의 범위는 -1.0 지금까지이 모두를 CSV DICT 리더와 작동하지 않는 DICT 이해입니다

6.0 :

Unorderedable 유형 :

with open("test_data.csv", 'r', encoding="Latin-1") as f: 
    reader = csv.DictReader(f) 
    rows = [row for row in reader if row['lat'] >= 51.0 if row['lat'] <= 59.0 if row['long'] >= -1.0 if row['long'] <= 6.0] 
    print(rows) 
가 현재 나는 형식 오류 얻을 STR을()> = INT() DictReader 문자열로 물건을 제공, 그들은 정수 값이 될 필요가 있기 때문에 아마이다. int()를 dict comprehension에 삽입하는 방법을 잘 모르겠습니다.

궁극적으로, 나는 다음과 같은 데이터를 선택 출력을 싶습니다 : 내가 나중에 다시 CSV에 데이터를 쓰는 원하는

id lat long var1 var2 var3 
1  52.1 0.07 A  
2  58.3 5.78   C 

내가, 사전의 형식에 대한 용납입니다. 메모리 문제가 발생하지 않는 한

+1

당신이 "작동하지 않습니다"말할 때 당신은 무엇을 의미합니까? – asongtoruin

+0

나는 DictReader이 문자열로의 제공으로 내가하는 int에 위도 갈망을 변환 할 필요가 있기 때문에 생각합니다. –

+0

나는 그것이 작동하지 않는다는 것을 의미하지 않는다. 나는 그것이 작동하지 않는다는 것을 의미한다. 오류가 있습니까? 출력이 올바르지 않습니까? 무슨 일이 일어나고있어 "일하지 않는다"고 생각하니? – asongtoruin

답변

1

, pandas 당신을 위해 일을 할 수 있어야합니다. 메모리 문제가 발생 할 경우, chunksize 매개 변수의 사용은 할 수

import pandas as pd 

df = pd.read_csv('test_data.csv') 

filtered = df[(df['lat'].between(51.0, 59.0, inclusive=True)) & 
       (df['long'].between(-1.0, 6.0, inclusive=True))] 

filtered.to_csv('filtered_test_data.csv') 

(좋은 패키지를하고있다) 당신은 당신이 아직하지 않은 경우 pandas 먼저 설치해야 할 수도 있습니다,하지만 pip를 사용하여 쉽게해야 당신은 단지 메모리에 일정량의 행을 읽습니다. 필터링은 행마다 독립적으로, 우리는 덩어리 당이 필터링을 적용하고 그들 모두를 결합 할 수 있습니다 :

import pandas as pd 

chunks = pd.read_csv('test_data.csv', chunksize=1000000) 

filtered = pd.concat([df[(df['lat'].between(51.0, 59.0, inclusive=True)) & 
         (df['long'].between(-1.0, 6.0, inclusive=True))] 
         for df in chunks]) 

filtered.to_csv('filtered_test_data.csv') 

이 여전히 작동하지 않으면, 당신은 각 청크를 저장하고 끝 부분에만 결합하는 시도 할 수 :

import pandas as pd 

chunks = pd.read_csv('test_data.csv', chunksize=1000000) 

i = 0 
for df in chunks: 
    filtered = df[(df['lat'].between(51.0, 59.0, inclusive=True)) & 
        (df['long'].between(-1.0, 6.0, inclusive=True))] 
    filtered.to_csv('chunk_{}.csv'.format(i)) 
    i += 1 

final = pd.concat(pd.read_csv('chunk_{}.csv'.format(j)) for j in range(i)) 
final.to_csv('final.csv') 
+0

감사 pandas'. –

+0

밤새이 프로그램을 실행하려고하면 메모리 문제가 발생하고 충돌합니다. 팬더가 아닌 버전이 있습니까? 팬더는 일반적으로 대용량 데이터 세트와 잘하지 않는 내가 원래 (이 179기가바이트이다)하는 CSV DictReader 응답을 요구하는 이유입니다. –

+0

@ThirstforKnowledge는 편집을 참조하십시오. 팬더는 많은 것을 처리 할 수 ​​있습니다. 나는 그것을 너무 빨리 쓰지 않을 것입니다! – asongtoruin