python - 在python中,如何根据具有下限和上限的查找表对范围进行分类
问题描述
编辑:这个问题被标记为重复,但我查看了另一个问题的解决方案,它并没有完全解决我的问题。所以这不是重复的。
我有一个带有数字变量的数据集,我想将它们映射到存储在查找表中的证据权重。下面是一个例子,但我有很多变量要转换。我怎样才能自动化呢?我过去曾使用 SAS 和 SQL 完成此操作,但不知道如何在 Python 中执行此操作?我搜索了互联网,但找到了使用 pd.cut 的示例。但是,它需要我们手动编码 bin 范围。我不确定如何自动执行此操作。我希望下限大于或等于(>=),上限小于(<)。
我在下面写了一个代码。我在掩码语句中收到错误。你能告诉我代码有什么问题吗?谢谢。
temp_dict = {'var1': [4, 2, 2, 4, 7, 4, 12, 8, 17, 42, 33, 10, 7, 5, 17, 29, 64, 20, 39, 6],
'var2': [9, 8, 2, 17, 14, 14, 16, 8, -999999999,-999999999, 10, -999999999, 16, 20, 17,
-999999999, -999999999, -999999999,-999999999, 3]}
df = pd.DataFrame.from_dict(temp_dict)
查找表:
指数 | 特征名称 | 下限 | 上限 | 祸不单行 |
---|---|---|---|---|
0 | 变量1 | -999999990 | 1.5 | 1.363071 |
1 | 变量1 | 1.5 | 2.5 | 1.231135 |
2 | 变量1 | 2.5 | 3.5 | 0.819431 |
3 | 变量1 | 3.5 | 14.5 | 0.617399 |
4 | 变量1 | 14.5 | 15.5 | -0.62779 |
5 | 变量1 | 15.5 | 20.5 | -0.706259 |
6 | 变量1 | 20.5 | 999999990 | -0.950134 |
7 | 变量1 | -999999999 | -999999999 | 0 |
8 | 变量1 | 钠 | 钠 | 0 |
0 | 变量2 | -999999990 | 0.5 | 0.951202 |
1 | 变量2 | 0.5 | 1.5 | 0.427215 |
2 | 变量2 | 1.5 | 2.5 | 0.218994 |
3 | 变量2 | 2.5 | 3.5 | 0.026722 |
4 | 变量2 | 3.5 | 13.5 | -0.071878 |
5 | 变量2 | 13.5 | 999999990 | -1.615368 |
6 | 变量2 | -999999999 | -999999999 | 0 |
7 | 变量2 | 钠 | 钠 | 0 |
期望的结果:
变量1 | 变量2 | WoE_var1 | WoE_var2 |
---|---|---|---|
4 | 9 | 0.617399 | -0.071878 |
2 | 8 | 1.231135 | -0.071878 |
2 | 2 | 1.231135 | 0.218994 |
4 | 17 | 0.617399 | -1.615368 |
7 | 14 | 0.617399 | -1.615368 |
编辑:
我想通了。这是代码。
binned_vars= ['var1','var2'..'varn']
short_list= ['var1','var2']
for variable in binned_vars:
if variable in short_list:
for i in lookup_table[(lookup_table['feature_name'] == variable)]['Index'].to_list():
lower_limit = lookup_table[(lookup_table['feature_name'] == variable) & (lookup_table['Index'] == i)]['lower_limit'].to_list()[0]
upper_limit = lookup_table[(lookup_table['feature_name'] == variable) & (lookup_table['Index'] == i)]['upper_limit'].to_list()[0]
WoE = lookup_table[(lookup_table['feature_name'] == variable) & (lookup_table['Index'] == i)]['WoE'].to_list()[0]
mask = ((df[variable] >= lower_limit) & (df[variable] < upper_limit))
var_name = variable + '_WoE'
df.loc[mask,var_name] = WoE
解决方案
推荐阅读
- f# - 针对 PrintfFormat 编写单元测试
- vue.js - 为什么我的课程没有显示在 vue 中,但我的条件课程却显示了?
- c++ - 您将如何在预编译期间自动生成类实现?
- jquery - 使用 jquery 将数据更新到 mysql 时遇到问题
- android - 从列表视图中删除一行后刷新片段
- javascript - 1 除以 5198000 时 JavaScript 中的除法错误
- c# - 根据excel表上的值获取单元格范围/位置并在c#中为单元格datagridview着色
- c++ - 使用 4 个列表,创建一个包含所有总和的列表
- spring - Spring Cloud 配置服务器不尊重 logging.file 属性并且不记录外部文件
- javascript - 当按下空格键而不是按钮时,Reactjs用keydown触发按钮