Python 使用CSV DictReader按行读取,并根据lat长范围进行筛选
我有179 GB的以下稀疏数据: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 到目前为止,我只有一
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')