使用CSV DictReader读取行并根据纬度范围过滤

时间:2017-09-13 08:12:30

标签: python dictionary list-comprehension

我有179 GB的以下稀疏数据:

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

我想读取数据并进行过滤,以便只保留某些lat长坐标之间的行。在此代表中,纬度的示例范围是51.0到59.0,经度的范围是-1.0到6.0

到目前为止我所有人都是一个CSV dict读者和一个不起作用的词典理解:

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:无法排序的类型:str()&gt; = int()这可能是因为DictReader将字符串作为字符串,它们需要是整数值。我不确定如何将int()插入到dict理解中。

最终,我希望输出选择以下数据:

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

我对字典的格式感到矛盾,因为我想在之后将数据写回csv。

1 个答案:

答案 0 :(得分: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')

如果这仍然不起作用,您可以尝试保存每个块并仅在最后组合:

{{1}}