如何基于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
相关产品推荐
相关产品推荐

