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

如何利用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:55:18