如何对Python DataFrame子集按Price排名并重新分配Position值
解决方案
方法一:基于排名线性映射到0-9范围
如果需要将每个Price的排名按比例缩放到0-9的整数(最低Price对应0,最高对应9),按以下步骤操作:
生成
Side=1行的布尔筛选掩码:mask = d['Side'] == 1对筛选出的
Price列做升序排名(1起始),转换为0起始的排名:rank_0based = d.loc[mask, 'Price'].rank(ascending=True) - 1将0起始排名线性映射到0-9整数范围,最后转成整数类型:
max_rank = rank_0based.max() d.loc[mask, 'Position'] = (rank_0based / max_rank * 9).astype(int)注:若所有
Price值完全相同,会出现除以0的情况,可提前判断处理。
方法二:分箱为10个等级(0-9)
如果需要将Price从低到高均匀划分成10个等级,最低等级为0、最高为9,用pd.qcut更直接:
mask = d['Side'] == 1 # 按Price切割为10个区间,对应标签0到9 d.loc[mask, 'Position'] = pd.qcut(d.loc[mask, 'Price'], q=10, labels=range(10))
注:若Price存在大量重复值导致无法均分10个区间,可添加duplicates='drop'参数调整分箱逻辑。
验证结果
可通过以下代码查看更新后的目标子集:
print(d[d['Side'] == 1][['Price', 'Position']])
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

