Python 使用CSV DictReader按行读取,并根据lat长范围进行筛选

Python 使用CSV DictReader按行读取,并根据lat长范围进行筛选,python,dictionary,list-comprehension,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-long坐标之间的行。在此reprex中,纬度的示例范围为51.0到59.0,经度的范围为-1.0到6.0 到目前为止,我只有一

我有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-long坐标之间的行。在此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)

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

除非您遇到内存问题,
pandas
应该能够为您完成这项工作。如果您还没有安装pandas,您可能需要先安装pandas,但使用pip应该很容易(这是一个很好的软件包)

如果确实遇到内存问题,使用
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')

你说它“不工作”是什么意思?我想这是因为我需要将lat long转换为int,因为DictReader将它们作为字符串引入。我不是说它为什么不工作,我是说它怎么不工作。你有错误吗?输出是否不正确?发生了什么事情让你觉得它“不起作用”@asongtoruin我已经修改了这个问题,你应该将它们作为浮点数进行比较,因为没有整数值。您可以使用
float(行['lat'])强制转换为float
。此外,对于你的标签,你使用的是一个列表理解,尽管它是一个dict列表。在试图运行这个一夜之后,它陷入了记忆困难并崩溃。有没有非熊猫版本?这就是我最初要求CSV DictReader回答的原因,因为Pandas通常不能很好地处理大数据集(这是179GB)。@E请参阅编辑。熊猫可以应付很多事情,我不会这么快就把它一笔勾销!尽管如此,实际上,它仍然可能在179gb上崩溃。谢谢,我将尝试块大小并确认答案是否有效@请确认,这将取决于有多少条记录符合您的条件-使用
chunksize
可以让pandas遍历文件,因此在任何时候,它都将拥有当前块加上内存中以前任何块中找到的匹配项。
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')