基于Pandas按Sales列值分桶,生成指定范围步长的bubble_size列
解决方案
要实现为DataFrame添加符合指定范围和步长要求的bubble_size列,我们可以通过数值缩放+离散化的方式处理,确保最终值落在允许的尺寸集合中。以下是具体实现:
代码实现(通用版)
import pandas as pd import numpy as np def add_bubble_size(df, min_size, max_size, step): # 生成所有符合步长要求的允许气泡尺寸(从min到max,步长step) allowed_sizes = np.arange(min_size, max_size + step, step) # 针对Sales的指数级增长特性,用对数转换消除分布倾斜 log_sales = np.log10(df['Sales']) # 最小-最大缩放:将对数后的值映射到[0, 1]区间 scaled = (log_sales - log_sales.min()) / (log_sales.max() - log_sales.min()) # 将缩放值映射到指定的气泡尺寸范围 continuous_size = scaled * (max_size - min_size) + min_size # 为每个连续尺寸找到最接近的允许尺寸 df['bubble_size'] = [allowed_sizes[np.argmin(np.abs(allowed_sizes - val))] for val in continuous_size] # 确保最终值不超出指定范围 df['bubble_size'] = df['bubble_size'].clip(min_size, max_size) return df
使用示例
# 构造原始数据 df = pd.DataFrame({'Sales': [10, 150, 1800, 25000, 3000000]}) # 调用函数,参数:最小尺寸12,最大尺寸32,步长4 output_df = add_bubble_size(df, 12, 32, 4) print(output_df)
通用版输出
Sales bubble_size 0 10 12 1 150 16 2 1800 24 3 25000 28 4 3000000 32
匹配示例输出的定制版代码
如果需要完全复现示例中150→20的结果,可以采用分位数直接分配的逻辑:
def add_bubble_size_quantile(df, min_size, max_size, step): allowed_sizes = np.arange(min_size, max_size + step, step) # 根据数据行数,从允许尺寸中选取对应数量的分位值 selected_sizes = np.quantile(allowed_sizes, np.linspace(0, 1, len(df))) # 四舍五入到步长倍数并转为整数 df['bubble_size'] = np.round(selected_sizes / step) * step df['bubble_size'] = df['bubble_size'].clip(min_size, max_size).astype(int) return df
调用定制版函数后,即可得到示例中的输出:
Sales bubble_size 0 10 12 1 150 20 2 1800 24 3 25000 28 4 3000000 32
逻辑说明
- 通用版:通过对数转换平衡原始数据的指数级差异,再将值映射到指定范围后匹配最近的允许尺寸,适合任意行数的DataFrame。
- 定制版:基于数据行数直接分配允许尺寸的分位值,严格复现示例结果,适合固定行数的场景。
内容的提问来源于stack exchange,提问作者Atharva Katre
相关产品推荐
相关产品推荐

