首页 > 解决方案 > 通过 pandas.cut() 函数创建 bin 后,如何有效地将每个值标记到 bin 中?

问题描述

假设我在数据框中有一列是“user_age”,并且我通过以下方式创建了“user_age_bin”:

df['user_age_bin']= pd.cut(df['user_age'], bins=[10, 15, 20, 25,30])

然后我使用“user_age_bin”功能构建了一个机器学习模型。

接下来,我得到了一条记录,我需要将其放入我的模型中并进行预测。我不想按user_age原样使用,因为模型使用user_age_bin. 那么,如何将user_age值(例如 28)转换为user_age_bin?我知道我可以创建这样的函数:

def assign_bin(age):
    if age < 10:
        return '<10'
    elif age< 15:
        return '10-15'
     ... etc. etc.

然后做:

user_age_bin = assign_bin(28)

但是这个解决方案一点也不优雅。我想一定有更好的方法,对吧?

编辑:我更改了代码并添加了明确的 bin 范围。Edit2:编辑措辞,希望问题现在更清楚。

标签: pythonpandasdata-manipulationbinninginference

解决方案


tl; dr:np.digitize是一个很好的解决方案。

在阅读了这里的所有评论和答案以及更多谷歌搜索之后,我想我得到了一个我非常满意的解决方案。谢谢你们所有人!

设置

import pandas as pd
import numpy as np
np.random.seed(42)

bins = [0, 10, 15, 20, 25, 30, np.inf]
labels = bins[1:]
ages = list(range(5, 90, 5))
df = pd.DataFrame({"user_age": ages})
df["user_age_bin"] = pd.cut(df["user_age"], bins=bins, labels=False)

# sort by age 
print(df.sort_values('user_age'))

输出

 user_age  user_age_bin
0          5             0
1         10             0
2         15             1
3         20             2
4         25             3
5         30             4
6         35             5
7         40             5
8         45             5
9         50             5
10        55             5
11        60             5
12        65             5
13        70             5
14        75             5
15        80             5
16        85             5

分配类别

# a new age value
new_age=30

# use this right=True and '-1' trick to make the bins match
print(np.digitize(new_age, bins=bins, right=True) -1)

输出

4

推荐阅读