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

如何基于Pandas Interval列筛选DataFrame特定百分位数以上的行?

嘿,我来帮你搞定这个筛选问题~其实有几种不同的思路,既可以直接用原数据筛选,也能基于你生成的bin列操作,我给你一步步说明:

方法1:直接用原变量筛选(最简便)

其实不需要借助分箱列,直接计算95百分位数的阈值,然后用布尔索引筛选就行,代码如下:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,100,size=150), columns=['whatever'])
# 计算95百分位数的临界值
p95_threshold = df['whatever'].quantile(0.95)
# 筛选大于等于该阈值的行
top5_percent_rows = df[df['whatever'] >= p95_threshold]
方法2:基于你已生成的bin列筛选

你生成的bin列是Pandas的Interval类型,其实它是支持比较操作的,我们可以通过以下两种方式筛选:

子方法2.1:通过区间左端点判断

因为pd.cut默认是左闭右开的区间,我们可以判断每个区间的左端点是否大于等于95百分位数的阈值:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,100,size=150), columns=['whatever'])
df_bins = np.linspace(df.min(), df.max(), 101)
df['bin'] = pd.cut(df.iloc[:,0], df_bins)

# 计算95百分位数
p95_threshold = df['whatever'].quantile(0.95)
# 筛选区间左端点 >= 阈值的行
top5_percent_rows = df[df['bin'].apply(lambda interval: interval.left >= p95_threshold)]

子方法2.2:直接比较Interval对象

我们可以构造一个以95百分位数为左端点的区间,然后直接和bin列的区间做比较:

# 接上面的代码
# 构造目标区间(左闭右开,和pd.cut默认一致)
target_interval = pd.Interval(p95_threshold, df['whatever'].max(), closed='left')
# 筛选所有大于等于目标区间的行
top5_percent_rows = df[df['bin'] >= target_interval]
额外推荐:用pd.qcut直接按分位数分箱

如果你的核心需求就是筛选特定百分位数的行,用pd.qcut会更贴合,它直接按分位数划分区间,每组样本数大致相等:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,100,size=150), columns=['whatever'])
# 按分位数分成20组(每组对应5%的样本)
df['quantile_bin'] = pd.qcut(df['whatever'], q=20)
# 筛选最后一组(即top5%的样本)
top5_percent_rows = df[df['quantile_bin'] == df['quantile_bin'].unique()[-1]]

内容的提问来源于stack exchange,提问作者mfastudillo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:27:07