df1:
Variables left right
0 AUM -0.001 28.20
1 AUM 28.20 40.28
2 AUM 40.28 58.27
3 AUM 58.27 80.72
4 AUM 80.72 100.00
0 ABS -88.01 200.72
1 ABS 200.72 480.72
2 ABS 480.72 800.20
0 LS 10000 200000
1 LS 200000 400000
df2:
Pan_no ABS AUM LS
0 AAA 28 30 10001
2 CCC 500 98 390000
1 BBB 250 50 150000
3 DDD 100 60 380000
4 EEE 88 10 378347
状况:
根据 df1 中的左右值,应在 df2 中创建一个新列,并且该列内的值应为该特定变量的 df1 的索引。
示例:在 df2 中,如果 AUM 值低于此范围 (-0.001 - 28.20),则新列将 df1 的索引值作为新值。即0
相似地,
在 df2 中,如果 ABS 值低于此范围 (200.72 - 480.72),则新列 ABS_BIN 将 df1 的索引值作为新值。即1
我试过的是:
binning_vars = ['ABS','AUM','LS']
def f(row):
for i in binning_vars:
for j in df1[df1['Variable'] == i].index:
if df1[i] >= df1['left'] & df1[i] >= df1['right']:
value = j
else:
pass
return value
df2[i,'_bin'] = df1.apply(f, axis=1)
但它会抛出一个错误,因为 TypeError: &: 'float' 和 'float' 不支持的操作数类型。任何帮助都感激不尽。
Expected Output:
with new columns in df2:
Pan_no ABS AUM LS ABS_BIN AUM_BIN LS_BIN
0 AAA 28 30 10001 0 1 0
1 BBB 250 50 150000 1 2 0
2 CCC 500 98 390000 2 4 1
3 DDD 100 60 380000 0 3 1
4 EEE 88 10 378347 0 0 1
您可以使用merge_asof
来避免使用apply
:
out = df2.merge(
pd.merge_asof((df2.melt(id_vars='Pan_no')
.astype({'value': float})
.sort_values(by='value')
),
df1.reset_index().sort_values(by='left'),
left_by='variable', right_by='Variables',
left_on='value', right_on='left', direction='backward')
.pivot(index='Pan_no', columns='variable', values='index')
.add_suffix('_BIN'),
left_on='Pan_no', right_index=True
)
输出:
Pan_no ABS AUM LS ABS_BIN AUM_BIN LS_BIN
0 AAA 28 30 10001 0 1 0
2 CCC 500 98 390000 2 4 1
1 BBB 250 50 150000 1 2 0
3 DDD 100 60 380000 0 3 1
4 EEE 88 10 378347 0 0 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句