基于分位数为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
相关产品推荐
相关产品推荐

