我有以下稀疏数据的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')