如何利用pd.cut为分数分配对应区间的概率值
问题:根据分数获取对应区间的概率值
我正在处理一份分数数据集,用pd.cut把分数划分到对应区间,已经生成了包含区间、频次和概率的统计表格,现在需要实现输入单个数值(比如265),返回其所属区间的概率值(比如6%)。
现有代码及输出
生成统计表格的代码
import pandas as pd data = pd.DataFrame({'scores':[168.0, 44.0, 352.0, 128.0, 268.0, 228.0, 160.0, 376.0, 304.0, 124.0, 360.0, 36.0, 224.0, 176.0, 40.0, 28.0, 264.0, 292.0, 228.0, 80.0, 216.0, 132.0, 88.0, 220.0, 284.0, 308.0, 256.0, 360.0, 364.0, 128.0, 268.0, 72.0, 100.0, 320.0, 224.0, 300.0, 232.0, 316.0, 196.0, 248.0, 24.0, 396.0, 8.0, 248.0, 244.0, 392.0, 240.0, 28.0, 260.0, 220.0, 120.0, 56.0, 232.0, 216.0, 228.0, 232.0, 332.0, 280.0, 148.0, 84.0, 284.0, 268.0, 176.0, 324.0, 52.0, 112.0, 344.0, 296.0, 164.0, 28.0, 304.0, 344.0, 232.0, 340.0, 324.0, 248.0, 232.0, 400.0, 396.0, 36.0, 52.0, 204.0, 292.0, 96.0, 68.0, 392.0, 260.0, 224.0, 236.0, 248.0, 316.0, 292.0, 212.0, 276.0, 304.0, 124.0, 216.0, 48.0, 64.0, 228.0]}) frequencyTable = pd.cut(data['scores'], bins = 20, include_lowest=True, ordered=True, precision=4, right=False) frequencyTable = frequencyTable.value_counts(sort=False) frequencyTable = frequencyTable.reset_index() frequencyTable['probability'] = frequencyTable['scores']/len(data) print(frequencyTable)
输出结果
index scores probability 0 [8.0, 27.6) 2 0.02 1 [27.6, 47.2) 7 0.07 2 [47.2, 66.8) 5 0.05 3 [66.8, 86.4) 4 0.04 4 [86.4, 106.0) 3 0.03 5 [106.0, 125.6) 4 0.04 6 [125.6, 145.2) 3 0.03 7 [145.2, 164.8) 3 0.03 8 [164.8, 184.4) 3 0.03 9 [184.4, 204.0) 1 0.01 10 [204.0, 223.6) 7 0.07 11 [223.6, 243.2) 14 0.14 12 [243.2, 262.8) 8 0.08 13 [262.8, 282.4) 6 0.06 14 [282.4, 302.0) 7 0.07 15 [302.0, 321.6) 7 0.07 16 [321.6, 341.2) 4 0.04 17 [341.2, 360.8) 5 0.05 18 [360.8, 380.4) 2 0.02 19 [380.4, 400.392) 5 0.05
解决方案:实现分数概率查询功能
在现有代码基础上添加查询函数即可,核心是确保区间匹配和统计表格一致:
import pandas as pd data = pd.DataFrame({'scores':[168.0, 44.0, 352.0, 128.0, 268.0, 228.0, 160.0, 376.0, 304.0, 124.0, 360.0, 36.0, 224.0, 176.0, 40.0, 28.0, 264.0, 292.0, 228.0, 80.0, 216.0, 132.0, 88.0, 220.0, 284.0, 308.0, 256.0, 360.0, 364.0, 128.0, 268.0, 72.0, 100.0, 320.0, 224.0, 300.0, 232.0, 316.0, 196.0, 248.0, 24.0, 396.0, 8.0, 248.0, 244.0, 392.0, 240.0, 28.0, 260.0, 220.0, 120.0, 56.0, 232.0, 216.0, 228.0, 232.0, 332.0, 280.0, 148.0, 84.0, 284.0, 268.0, 176.0, 324.0, 52.0, 112.0, 344.0, 296.0, 164.0, 28.0, 304.0, 344.0, 232.0, 340.0, 324.0, 248.0, 232.0, 400.0, 396.0, 36.0, 52.0, 204.0, 292.0, 96.0, 68.0, 392.0, 260.0, 224.0, 236.0, 248.0, 316.0, 292.0, 212.0, 276.0, 304.0, 124.0, 216.0, 48.0, 64.0, 228.0]}) # 生成区间统计表格,保留原始区间对象 bins = pd.cut(data['scores'], bins=20, include_lowest=True, ordered=True, precision=4, right=False) frequencyTable = bins.value_counts(sort=False).reset_index() frequencyTable['probability'] = frequencyTable['scores']/len(data) # 定义查询函数 def get_score_probability(input_score): # 匹配输入分数所在的区间 match_row = frequencyTable[frequencyTable['index'].apply(lambda interval: input_score in interval)] if not match_row.empty: # 转换为百分比格式返回 return f"{match_row['probability'].values[0] * 100:.0f}%" else: return "输入分数不在已划分的区间范围内" # 测试示例 print(get_score_probability(265)) # 输出:6%
说明
- 保留
pd.cut生成的bins对象,避免后续重新计算区间导致和统计表格不一致 - 通过
apply检查输入分数是否属于某个区间,找到对应的概率后转换为百分比格式 - 处理了分数超出区间范围的情况,返回明确提示
内容的提问来源于stack exchange,提问作者grandpa
相关产品推荐
相关产品推荐

