python - 通过 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:编辑措辞,希望问题现在更清楚。
解决方案
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
推荐阅读
- python - 矩阵中的for循环
- scala - 如何测试返回 Dataset[String, T] 的函数
- javascript - 为什么调用 fetch、axios、ajax 或 promise 时函数返回未定义
- python - Locust 负载测试脚本出错 - 连接中止。',RemoteDisconnected
- primary-key - 雪花批量加载的 AUTOINCREMENT 主键
- java - Quadtrees 应该只在孩子中存储点吗?
- mysql - 我可以使用什么子查询来根据字符串过滤数据?
- python - 我的 Pytorch CNN 计算但不显示训练结果
- python-3.x - 使用 tweepy 从 twitter 用户获取扩展 URL
- css - 是否可以仅使用 CSS 而不使用硬编码数字来获得与另一个元素相同的计算值?