使用CSV dictreader根据LAT长范围读取行和过滤器



我有以下稀疏数据的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长坐标之间的行。在此reprex中,纬度的示例范围为51.0至59.0,经度范围为-1.0至6.0

到目前为止,我所拥有的只是一个CSV DICED读者,并且是一个行不通的理解:

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()插入命令理解中。

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

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

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

除非遇到内存问题,否则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')

相关内容

最新更新