gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:46:35 26 4
gpt4 key购买 nike

我有 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

我想读入数据并进行过滤,以便仅保留某些经纬度坐标之间的行。在此表示中,纬度的示例范围是 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() 插入到 dict 理解中。

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

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 参数可以让您只将一定数量的行读入内存。由于您的过滤每行都是独立的,因此我们可以对每个 block 应用此过滤并将它们全部组合起来:

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

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

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

关于python - 使用 CSV DictReader 读取行并根据经纬度范围进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46192289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com