使用列表过滤Pandas的state列时触发内存错误,求替代实现方案
Hey,碰到这种内存错误真的挺闹心的,尤其是处理大尺寸的DataFrame时。我给你几个实用的替代方案,应该能帮你绕开这个问题:
先把合法缩写列表转成集合
列表的isin()操作是逐个比对,效率偏低,而集合的查找是O(1)级别的,内存开销也更小。先把SA转换成集合再做筛选,有时候这一个小改动就能解决内存问题:SA_set = set(SA) filtered_data = ag_data[ag_data['state'].isin(SA_set)]另外别忘了先给SA去重哦,如果列表里有重复值,会额外增加不必要的比对开销。
分块处理数据集
如果你的DataFrame大到一次性处理会撑爆内存,可以试试分块处理:
如果数据是从文件读取的,直接用pandas的分块读取功能:import pandas as pd chunk_size = 100000 # 根据你的内存情况调整块大小,比如10万行一块 filtered_chunks = [] for chunk in pd.read_csv('your_data_source.csv', chunksize=chunk_size): filtered_chunk = chunk[chunk['state'].isin(set(SA))] filtered_chunks.append(filtered_chunk) # 合并所有筛选后的块 filtered_data = pd.concat(filtered_chunks, ignore_index=True)如果数据已经在内存里了,也可以手动拆分DataFrame:
import numpy as np # 把原DataFrame拆分成10份(可根据内存调整份数) splits = np.array_split(ag_data, 10) filtered_list = [] for split_df in splits: filtered_list.append(split_df[split_df['state'].isin(set(SA))]) filtered_data = pd.concat(filtered_list, ignore_index=True)用
map()生成布尔掩码筛选
另一种更轻量的方式是用map()生成布尔掩码,再做筛选,内存占用可能比直接用isin()更低:SA_set = set(SA) # 生成一个布尔列,标记每行的state是否合法 mask = ag_data['state'].map(lambda x: x in SA_set) filtered_data = ag_data[mask]用Dask处理超大规模数据
要是你的数据大到单台机器的内存完全装不下,可以试试Dask DataFrame——它能像pandas一样操作,但会自动分块并行处理,完美适配超大数据集:import dask.dataframe as dd # 用Dask读取数据(支持csv、parquet等多种格式) ddf = dd.read_csv('your_data_source.csv') SA_set = set(SA) filtered_ddf = ddf[ddf['state'].isin(SA_set)] # 如果筛选后的结果能装下内存,就转成pandas DataFrame;否则直接保存到文件 filtered_data = filtered_ddf.compute() # 或者直接保存:filtered_ddf.to_csv('filtered_data.csv', single_file=True)
内容的提问来源于stack exchange,提问作者data_newbie14
相关产品推荐
相关产品推荐

