如何基于指定商品列表高效过滤GB级独热编码格式的DataFrame?
数GB级One-Hot编码订单DataFrame的高效过滤方案
你需要的过滤逻辑是保留目标商品列中任意一列值为1的行,直接用pandas原生向量化运算实现即可,完全避免Python层循环,性能是所有可行方案中最高的,两种不同场景的实现方式如下:
场景1:数据可完整加载到内存
如果你的服务器/本地内存足够放下全部数据,直接一行代码完成过滤:
import pandas as pd interesting_products = ['PRODUCT1', 'PRODUCT3'] # 读取时指定商品列数据类型为int8,相比默认float64内存占用仅为1/8,大幅提升运算效率 dtype_map = {col: 'int8' for col in interesting_products} df = pd.read_csv("your_order_file.csv", dtype=dtype_map) # 核心过滤逻辑:行方向判断目标列是否至少有一个1 filtered_df = df[df[interesting_products].any(axis=1)]
场景2:数据过大无法全量加载到内存
采用分块读取+逐块过滤+增量写入的方案,全程内存占用只和单块数据大小有关,普通配置的电脑也能轻松处理10GB以上的文件:
import pandas as pd interesting_products = ['PRODUCT1', 'PRODUCT3'] # 可根据内存大小调整单块行数,内存足够的话设置为100万行也可以 chunk_size = 100000 output_path = "filtered_orders.csv" is_first_chunk = True for chunk in pd.read_csv("your_large_order_file.csv", chunksize=chunk_size, dtype={col: 'int8' for col in interesting_products}): filtered_chunk = chunk[chunk[interesting_products].any(axis=1)] # 首块写入表头,后续块仅写入数据避免重复表头 filtered_chunk.to_csv(output_path, mode="a", header=is_first_chunk, index=False) is_first_chunk = False
性能说明
- 核心的
any(axis=1)运算为pandas底层C实现,比用apply、iterrows等Python层遍历的方案快50~100倍 - 不需要额外引入Dask、PySpark等分布式框架,学习成本和运行开销极低
内容的提问来源于stack exchange,提问作者Aventinus
相关产品推荐
相关产品推荐

