如何基于阈值筛选DataFrame中对应产品及年份的数据
高效筛选达标产品及对应年份的Pandas方案
核心思路
用Pandas的向量化操作替代逐行遍历,通过将宽格式数据转为长格式,直接过滤达标数据,效率远高于apply逐行处理。
步骤1:准备示例数据(匹配你的数据格式)
import pandas as pd # 模拟你的产品年度数据 data = { 'Product': ['A', 'B', 'C', 'D', 'C', 'D', 'E', 'A'], '2006.0': [10.0, 30.0, 15.0, 8.0, 15.0, 8.0, 61.0, 10.0], '2007.0': [12.0, 20.0, 25.0, 20.0, 25.0, 20.0, 72.0, 12.0], '2008.0': [13.0, 25.0, 28.0, 32.0, 28.0, 32.0, 76.0, 13.0], '2009.0': [15.0, 27.0, 30.0, 44.0, 30.0, 44.0, 85.0, 15.0], '2010.0': [18.0, 30.0, 36.0, 56.0, 36.0, 56.0, 68.0, 18.0], '2011.0': [23.0, 35.0, 40.0, 58.0, 40.0, 58.0, 60.0, 23.0] } df = pd.DataFrame(data)
步骤2:宽表转长表(关键优化)
用melt将年份列转为行记录,让每个产品-年份对对应一个数值,为后续过滤做准备:
# 转长表:Product作为标识,年份转为单独列,数值对应到Value列 long_df = df.melt(id_vars='Product', var_name='Year', value_name='Value') # 可选:清理年份格式(去掉.0,转为整数) long_df['Year'] = long_df['Year'].str.replace('.0', '').astype(int)
步骤3:筛选达标数据
设定阈值后,直接用布尔索引过滤:
# 自定义阈值,比如设为30 threshold = 30 # 筛选出数值≥阈值的记录 result = long_df[long_df['Value'] >= threshold] # 可选:按产品、年份排序,提升可读性 result = result.sort_values(by=['Product', 'Year']).reset_index(drop=True)
结果示例
输出的result格式如下:
Product Year Value 0 B 2006 30.0 1 B 2010 30.0 2 B 2011 35.0 3 C 2009 30.0 4 C 2010 36.0 5 C 2011 40.0 6 D 2008 32.0 7 D 2009 44.0 ...
效率优势说明
melt和布尔索引都是Pandas底层优化的向量化操作,完全避免了Python层面的逐行循环(apply本质是隐式循环)- 处理大数据集时,速度比
apply快10~100倍,内存占用也更低
内容的提问来源于stack exchange,提问作者elksie5000
相关产品推荐
相关产品推荐

