Pandas:根据其他单元格值的条件,在数据帧单元格上应用带参数的函数,函数的参数来自该行的单元格



我想根据其他列中值的条件,对数据帧中一列的每个单元格值应用一个函数。

在下面的示例数据帧中,我希望Field3(当前显示的是*(列具有从函数返回的基于传递的Instrument值的值to_Year_Maturity。请注意,数据帧在生产中有50k条记录,基于传递的Instrument导出函数返回是一个昂贵的数据库调用。我在pandas行下面尝试,但当我硬编码到[0]时,它从第0个仪器返回了所有相同的值,所以在这种情况下是5Y。我的要求是能够通过每个仪器,并替换该行的Fields3,以这种方式替换整个表格。提前谢谢。

CCY,Field0,Field1,Field3,Scenario,Instrument
USD,CSW,.03456,*,CSW,ABC
USD,SPRD,.00238,*,DV1,GFH
USD,IR0,.0098,*,IR1,WQD
USD,IRF0,.256,*,IRF,POU
USD,CSW,.9876,*,CSW,LKY
USD,CSW,.12678,*,CSW,BVF
USD,SPRD,.0072,*,DV1,FCD
USD,IR0,.03248,*,IR1,LKS
USD,IRF0,.0963,*,IRF,ZSX
USD,CSW,.5632,*,CSW,BNH
USD,SPRD,.9812,*,DV1,NBV
USD,IR0,.0098,*,IR1,MKN
USD,IRF0,.256,*,IRF,CVR
SCENARIO_LIST = ['CSW', 'DV1']
def to_Year_Maturity( instrument):
return {'ABC':'5Y', 'GFH':'1Y3M', 'WQD':'6Y9M', 'POU':'10Y6M', 'LKY':'9M', 'BVF':'3Y3M', 'FCD':'6Y9M', 'LKS':'2Y9M', 'ZSX':'12Y3M', 'BNH':'7Y6M', 'NBV':'20Y9M', 'MKN':'6Y9M', 'CVR':'20Y9M'}.get(instrument,'99Y')

我的尝试

view['Field3'] = np.where(view['Scenario'].isin(SCENARIO_LIST), to_Year_Maturity(view['Instrument'][0]), view['Field3'])

上面为所有符合SCENARIO_LIST条件的行返回5Y。也在下面尝试,但抛出错误

TypeError: unhashable type: 'Series'
view['Field3'] = np.where(view['Scenario'].isin(SCENARIO_LIST), to_Year_Maturity(view['Instrument'].astype(str)), view['Field3'])

我的预期输出应该像

CCY,Field0,Field1,Field3,Scenario,Instrument
USD,CSW,.03456,5Y,CSW,ABC
USD,SPRD,.00238,1Y3M,DV1,GFH
USD,IR0,.0098,*,IR1,WQD
USD,IRF0,.256,*,IRF,POU
USD,CSW,.9876,9M,CSW,LKY
USD,CSW,.12678,3Y3M,CSW,BVF
USD,SPRD,.0072,6Y9M,DV1,FCD
USD,IR0,.03248,*,IR1,LKS
USD,IRF0,.0963,*,IRF,ZSX
USD,CSW,.5632,7Y6M,CSW,BNH
USD,SPRD,.9812,20Y9M,DV1,NBV
USD,IR0,.0098,*,IR1,MKN
USD,IRF0,.256,*,IRF,CVR

您可以通过以下方式实现。给定np.where(condition, [x, y, ]/),您希望x由传递函数后应用于df['Instrument']pd.Series.map组成。现在,无论何时condition == True,都将产生用于所有key匹配的相关联的value。因此:

import pandas as pd
import numpy as np
SCENARIO_LIST = ['CSW', 'DV1']
def to_Year_Maturity( instrument):
return {'ABC':'5Y', 'GFH':'1Y3M', 'WQD':'6Y9M', 'POU':'10Y6M', 
'LKY':'9M', 'BVF':'3Y3M', 'FCD':'6Y9M', 'LKS':'2Y9M', 
'ZSX':'12Y3M', 'BNH':'7Y6M', 'NBV':'20Y9M', 'MKN':'6Y9M', 
'CVR':'20Y9M'}.get(instrument,'99Y')
df['Field3'] = np.where(df['Scenario'].isin(SCENARIO_LIST),
df['Instrument'].map(to_Year_Maturity),
df['Field3'])
print(df)
CCY Field0   Field1 Field3 Scenario Instrument
0   USD    CSW  0.03456     5Y      CSW        ABC
1   USD   SPRD  0.00238   1Y3M      DV1        GFH
2   USD    IR0  0.00980      *      IR1        WQD
3   USD   IRF0  0.25600      *      IRF        POU
4   USD    CSW  0.98760     9M      CSW        LKY
5   USD    CSW  0.12678   3Y3M      CSW        BVF
6   USD   SPRD  0.00720   6Y9M      DV1        FCD
7   USD    IR0  0.03248      *      IR1        LKS
8   USD   IRF0  0.09630      *      IRF        ZSX
9   USD    CSW  0.56320   7Y6M      CSW        BNH
10  USD   SPRD  0.98120  20Y9M      DV1        NBV
11  USD    IR0  0.00980      *      IR1        MKN
12  USD   IRF0  0.25600      *      IRF        CVR

也可能:

df['Field3'] = df.loc[df['Scenario'].isin(SCENARIO_LIST),'Instrument']
.map(to_Year_Maturity)
# reset all NaNs to asterisks
df = df.fillna('*')

相关内容

最新更新