2017-09-13 81 views
1

我有179 GB以下數據稀疏:使用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緯度的例子範圍是51.0至59.0,經度範圍爲-1.0至6.0

所有我至今是一個CSV字典閱讀器和不工作的字典理解:

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) 

目前我得到一個TypeError:Unorderedable types:str()> = int()這可能是因爲DictReader以字符串形式引入事物,並且它們需要是整數值。我不確定如何將int()插入字典理解中。

最後,我想輸出選擇以下數據:

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

我是矛盾的關於字典的格式,因爲我想在以後的數據寫回爲CSV。

+1

當你說它「不工作」時,你是什麼意思? – asongtoruin

+0

我認爲這是因爲我需要將lat longs轉換爲整數,就像DictReader以字符串形式輸入它們一樣。 –

+0

我不是說_why_不是工作,我的意思是_how_不工作。你有錯誤嗎?輸出是否不正確?發生了什麼讓你認爲它「不起作用」? – asongtoruin

回答

1

除非遇到內存問題,否則pandas應該能夠爲您完成這項工作。您可能需要安裝pandas第一,如果你還沒有這樣做,但它應該是很容易使用pip(並且是一個很大的包)

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') 

如果你遇到內存問題,使用chunksize參數讓你只能讀取一定數量的行到內存中。當你的過濾是每行獨立的,我們可以每塊應用此篩選,並結合他們都:

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

謝謝,asongtoruin這個工作。 –

+0

一夜之間試圖運行後,它陷入記憶困難並墜毀。有沒有非熊貓版本?這就是爲什麼我最初要求提供一個CSV DictReader答案,因爲Pandas通常不適合大數據集(這是179GB)。 –

+0

@ThirstforKnowledge查看編輯。熊貓可以處理很多,我不會這麼快寫下來! – asongtoruin

相關問題