我想根据其他列中值的条件,对数据帧中一列的每个单元格值应用一个函数。
在下面的示例数据帧中,我希望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('*')