如何以Pythonic方式为非连续数据创建自定义Bins?
离散数据的Pythonic分箱实现方案
针对你的非连续型数据,这里提供几种简洁的Pythonic方式来生成指定的分箱列:
方法1:字典映射 + Series.map()
这是最直观的离散值归类方式,先定义好原始值到目标分箱标签的映射关系,再批量处理:
import pandas as pd # 假设原始数据列为df['RawData'],先定义分箱映射规则 bin_mapping = {} # 批量添加19-24区间的映射 for num in range(19, 25): bin_mapping[num] = "19-24" # 批量添加25-34区间的映射 for num in range(25, 35): bin_mapping[num] = "25-34" # 批量添加55-64区间的映射 for num in range(55, 65): bin_mapping[num] = "55-64" # 处理不在上述区间的数值,统一映射为"其他" unmatched_vals = [x for x in df['RawData'].unique() if x not in bin_mapping] bin_mapping.update({val: "其他" for val in unmatched_vals}) # 生成目标分箱列 df['MySpecificBins'] = df['RawData'].map(bin_mapping)
如果原始数据是字符串格式的数值(比如"20"、"30"),只需把字典的键改成对应字符串即可。
方法2:转数值后用pd.cut(适用于可转数值的离散数据)
如果你的离散数据本质是数值型(或可转为数值的字符串),依然可以借助pd.cut,通过指定labels参数直接生成目标标签:
import pandas as pd # 先将离散列转为数值类型(处理转换失败的情况) df['RawDataNum'] = pd.to_numeric(df['RawData'], errors='coerce') # 定义分箱边界和对应标签 bins = [-float('inf'), 19, 24, 25, 34, 55, 64, float('inf')] labels = ["<19", "19-24", "25-34", "35-54", "55-64", ">64"] # 生成分箱列,include_lowest=True确保左边界包含在内 df['MySpecificBins'] = pd.cut(df['RawDataNum'], bins=bins, labels=labels, include_lowest=True)
方法3:np.select多条件映射(适用于复杂规则)
如果分箱规则需要更灵活的条件判断,用np.select可以直接基于逻辑条件归类,无需枚举所有原始值:
import pandas as pd import numpy as np # 定义分箱条件和对应的标签 conditions = [ (df['RawData'] >= 19) & (df['RawData'] <= 24), (df['RawData'] >= 25) & (df['RawData'] <= 34), (df['RawData'] >= 55) & (df['RawData'] <= 64) ] choices = ["19-24", "25-34", "55-64"] # 生成分箱列,不在条件内的值设为"其他" df['MySpecificBins'] = np.select(conditions, choices, default="其他")
内容的提问来源于stack exchange,提问作者Medina Campero
相关产品推荐
相关产品推荐

