Pandas / odo / bcolz 从大型 CSV 文件中选择性地加载行
Pandas / odo / bcolz selective loading of rows from a large CSV file
假设我们有一个很大的 csv 文件(例如 200 GB),其中只有一小部分行(例如 0.1% 或更少)包含感兴趣的数据。
假设我们将这样的条件定义为让一个特定列包含来自预定义列表的值(例如 10K 个感兴趣的值)。
odo
或 Pandas 是否有助于将这种类型的行选择性加载到数据框中的方法?
我不知道 odo
或 pandas
中有什么能完全满足您的要求,因为您只需调用一个函数,其他所有操作都在兜帽。但是,您可以编写一个简短的 pandas
脚本来完成这项工作。
基本思想是遍历适合内存的 csv 文件块,只保留感兴趣的行,然后在最后合并所有感兴趣的行。
import pandas as pd
pre_defined_list = ['foo', 'bar', 'baz']
good_data = []
for chunk in pd.read_csv('large_file.csv', chunksize=10**6):
chunk = chunk[chunk['column_to_check'].isin(pre_defined_list)]
good_data.append(chunk)
df = pd.concat(good_data)
Add/alter pd.read_csv
和 pd.concat
的参数根据您的具体情况而定。
如果性能有问题,您可以使用 .isin
的替代方案来加快速度,如 this 答案中所述。
假设我们有一个很大的 csv 文件(例如 200 GB),其中只有一小部分行(例如 0.1% 或更少)包含感兴趣的数据。
假设我们将这样的条件定义为让一个特定列包含来自预定义列表的值(例如 10K 个感兴趣的值)。
odo
或 Pandas 是否有助于将这种类型的行选择性加载到数据框中的方法?
我不知道 odo
或 pandas
中有什么能完全满足您的要求,因为您只需调用一个函数,其他所有操作都在兜帽。但是,您可以编写一个简短的 pandas
脚本来完成这项工作。
基本思想是遍历适合内存的 csv 文件块,只保留感兴趣的行,然后在最后合并所有感兴趣的行。
import pandas as pd
pre_defined_list = ['foo', 'bar', 'baz']
good_data = []
for chunk in pd.read_csv('large_file.csv', chunksize=10**6):
chunk = chunk[chunk['column_to_check'].isin(pre_defined_list)]
good_data.append(chunk)
df = pd.concat(good_data)
Add/alter pd.read_csv
和 pd.concat
的参数根据您的具体情况而定。
如果性能有问题,您可以使用 .isin
的替代方案来加快速度,如 this 答案中所述。