我有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长坐标之间的行。在此代表中,纬度的示例范围是51.0到59.0,经度的范围是-1.0到6.0
到目前为止我所有人都是一个CSV dict读者和一个不起作用的词典理解:
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:无法排序的类型:str()&gt; = int()这可能是因为DictReader将字符串作为字符串,它们需要是整数值。我不确定如何将int()插入到dict理解中。
最终,我希望输出选择以下数据:
id lat long var1 var2 var3
1 52.1 0.07 A
2 58.3 5.78 C
我对字典的格式感到矛盾,因为我想在之后将数据写回csv。
答案 0 :(得分:1)
除非您遇到内存问题,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')
如果这仍然不起作用,您可以尝试保存每个块并仅在最后组合:
{{1}}