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

基于分位数为Pandas价格数据生成带行数及ID列表的统计

解决Pandas分位数区间统计及价位划分问题

我来帮你搞定这个需求!你已经算出了分位数的价格阈值,接下来只需要把每个区间对应的行数和id列表统计出来,还能顺便搞定高、中、低价位的划分,一步步来:

第一步:整理分位数阈值,补全区间起点

你之前的代码拿到了分位数,但为了方便划分区间,最好把**0.0分位数(也就是价格最小值,或者你想用0也可以)**加上,这样每个区间的上下限都清晰:

import pandas as pd

# 假设你的原始DataFrame叫df
# 定义需要的分位数列表,加上0.0作为第一个区间的起点
quantile_list = [0.0, 0.2, 0.4, 0.6, 0.8, 0.95, 0.99, 1.0]
# 生成带分位数和对应价格阈值的DataFrame
quantiles_df = df['price'].quantile(quantile_list).reset_index()
quantiles_df.columns = ['quantile', 'price_threshold']

第二步:遍历分位数区间,统计行数和id列表

接下来我们逐个处理每个区间,计算每个分位数对应的区间内的行数和id集合:

result_rows = []

# 从第2个分位数开始遍历(第一个是区间起点)
for i in range(1, len(quantiles_df)):
    current_q = quantiles_df.loc[i, 'quantile']
    current_threshold = quantiles_df.loc[i, 'price_threshold']
    prev_threshold = quantiles_df.loc[i-1, 'price_threshold']
    
    # 确定区间筛选条件
    if i == 1:
        # 第一个区间:价格 ≤ 当前分位数阈值(如果你的价格都是正数,也可以用0代替prev_threshold)
        mask = df['price'] <= current_threshold
        range_desc = f"0 - {current_threshold:.1f}"
    else:
        # 后续区间:价格 > 上一个阈值 且 ≤ 当前阈值
        mask = (df['price'] > prev_threshold) & (df['price'] <= current_threshold)
        range_desc = f"{prev_threshold:.1f} - {current_threshold:.1f}"
    
    # 筛选符合条件的行
    filtered_data = df[mask]
    # 统计行数和id列表
    row_count = len(filtered_data)
    id_list = filtered_data['id'].tolist()
    
    # 把结果存入列表
    result_rows.append({
        'quantile': current_q,
        'price_threshold': current_threshold,
        'price_range': range_desc,
        'No_of_rows': row_count,
        'ids': id_list
    })

# 转换成最终的结果DataFrame
final_result_df = pd.DataFrame(result_rows)

运行完这段代码,final_result_df就是你要的包含分位数、价格阈值、区间范围、行数和id列表的DataFrame了。

第三步:划分高、中、低价位

有了上面的结果,划分价位就很简单了,你可以根据业务需求自定义区间,比如把0-0.4分位数归为低价,0.4-0.8归为中价,0.8以上归为高价:

方式1:给结果DataFrame添加价位列

def assign_price_tier(quantile):
    if quantile <= 0.4:
        return 'Low'
    elif quantile <= 0.8:
        return 'Medium'
    else:
        return 'High'

final_result_df['price_tier'] = final_result_df['quantile'].apply(assign_price_tier)

方式2:直接给原始DataFrame添加价位标签

如果你想给每个产品都打上价位标签,可以直接基于分位数阈值来划分:

# 获取低、中、高价位的阈值
low_cutoff = quantiles_df[quantiles_df['quantile'] == 0.4]['price_threshold'].values[0]
high_cutoff = quantiles_df[quantiles_df['quantile'] == 0.8]['price_threshold'].values[0]

# 用pd.cut给每个产品分配价位
df['price_tier'] = pd.cut(
    df['price'],
    bins=[0, low_cutoff, high_cutoff, float('inf')],
    labels=['Low', 'Medium', 'High']
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:42:33