You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于阈值筛选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:00:09