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
uj5u.com熱心網友回復:
您可以使用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
uj5u.com熱心網友回復:
您可以pd.cut在函式內部使用和避免回圈binning:
def binning(sr):
df = df1.loc[df1['Variables'] == sr.name, ['left', 'right']]
bins = sorted(set(df.to_numpy().ravel()))
return pd.cut(sr, bins=bins, labels=df.index)
out = df2[binning_vars].apply(binning).add_suffix('_BIN')
df2 = pd.concat([df2, out], axis=1)
輸出:
>>> df2
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/448661.html
標籤:Python python-3.x 熊猫 数据框 麻木的
上一篇:使用不是符號張量的輸入呼叫層up_sampling2d_1。接收型別:<class'numpy.ndarray'>
