使用pd.qcut生成分位数区间后无法筛选Pandas DataFrame怎么办
问题根因
pd.qcut生成的bins列数据类型为分类(Categorical)类型,列内每个元素都是pandas.Interval区间对象,不是字符串,也不能直接用不规范的区间字面量匹配,因此你之前的两种写法都不生效:
- 直接写
(-0.001, 9.9]]不符合Python基础语法,直接触发语法错误 - 把区间转为字符串做等值匹配,类型不匹配,因此返回空结果
正确筛选方案
方案1:构造Interval对象匹配
按照qcut默认的右闭合规则,构造对应边界的Interval对象做等值匹配即可:
import pandas as pd # 构造目标区间对象,closed指定右闭合和qcut默认规则对齐 target_bin = pd.Interval(left=-0.001, right=9.9, closed="right") # 执行筛选 filter_df = df[df["bins"] == target_bin]
方案2:生成区间时指定标签简化后续筛选
如果后续需要频繁按分位筛选,可以在生成bins时直接指定分位序号作为标签,后续筛选不需要记边界:
# 生成bins时指定labels为1-10,对应10个十分位 df["bins"] = pd.qcut(df["values"], q=10, labels=range(1, 11)) # 筛选第一个十分位直接匹配标签即可 filter_df = df[df["bins"] == 1]
方案3:直接取用生成的分类区间列表
如果不确定生成的区间边界,可以先提取所有生成的区间列表,直接取用对应位置的区间做匹配:
# 查看所有分位区间的列表 all_bins = df["bins"].cat.categories # 取第一个区间做筛选 filter_df = df[df["bins"] == all_bins[0]]
内容的提问来源于stack exchange,提问作者Rodrigo Meireles
相关产品推荐
相关产品推荐

