![](/img/trans.png)
[英]Creating a new column in a dataframe based on matches with another dataframe
[英]Populating a new dataframe column based on column matches for another dataframe
因此,我有一個通過讀取CSV文件創建的數據框對象(bhavcopy)。 此數據框對象具有多種類型,我必須根據一列(儀表)將其插入不同的表中。
因此,在下面的代碼中,我正在使用lambda函數從另一個數據框中獲取值。(我正在嘗試根據futidx數據框中的“ close1”列在optidx數據框中創建新列, 'Symbol','Expiry_dt','Timestamp1'的值與optidx數據幀中的值相同。
bhavcopy=pd.read_csv(path+bhavcopyfile, parse_dates=['EXPIRY_DT', 'TIMESTAMP'])
print('Processing: '+bhavcopyfile)
if(bhavcopyfile!='fo14MAY2012bhav.csv'):
bhavcopy=bhavcopy.drop('Unnamed: 15', axis=1)
#print(bhavcopy.head())
futidx=bhavcopy[bhavcopy['INSTRUMENT']=='FUTIDX']
futidx=futidx.drop('INSTRUMENT', axis=1)
futidx.columns=['SYMBOL', 'EXPIRY_DT', 'STRIKE_PR', 'OPTION_TYP', 'OPEN1', 'HIGH', 'LOW', 'CLOSE1', 'SETTLE_PR', 'CONTRACTS', 'VAL_INLAKH', 'OPEN_INT', 'CHG_IN_OI', 'TIMESTAMP1']
#futidx.to_sql(con=cnx, name='futidx', if_exists='append', index=False)
optidx=bhavcopy[bhavcopy['INSTRUMENT']=='OPTIDX']
optidx=optidx.drop('INSTRUMENT', axis=1)
optidx.columns=['SYMBOL', 'EXPIRY_DT', 'STRIKE_PR', 'OPTION_TYP', 'OPEN1', 'HIGH', 'LOW', 'CLOSE1', 'SETTLE_PR', 'CONTRACTS', 'VAL_INLAKH', 'OPEN_INT', 'CHG_IN_OI', 'TIMESTAMP1']
optidx['fut_close']=optidx.apply(lambda row: futidx[(futidx['SYMBOL']==row['SYMBOL']) & (futidx['EXPIRY_DT']==row['EXPIRY_DT']) &(futidx['TIMESTAMP1'] ==row['TIMESTAMP1'])].iloc[0], axis=1)
#optidx.apply(lambda row: futidx[(futidx['SYMBOL']==row.SYMBOL) & (futidx['EXPIRY_DT'] == row.EXPIRY_DT) & (futidx['TIMESTAMP1'] ==row.TIMESTAMP1)].iloc[0]['CLOSE1'], axis=1 )
print(optidx.head())
#optidx.to_sql(con=cnx, name='optidx', if_exists='append', index=False)
但是,我不斷收到以下錯誤:
IndexError: ('single positional indexer is out-of-bounds', 'occurred at index 659')
任何關於如何完成此工作的想法/建議都非常受歡迎。
這是文件中的一些示例數據...
INSTRUMENT SYMBOL EXPIRY_DT STRIKE_PR OPTION_TYP OPEN HIGH LOW CLOSE SETTLE_PR CONTRACTS VAL_INLAKH OPEN_INT CHG_IN_OI TIMESTAMP
FUTIDX BANKNIFTY 25-Jan-18 0 XX 25534 25668.3 25520.65 25636.5 25636.5 51965 531887.44 1650200 123080 5-Jan-18
FUTIDX BANKNIFTY 22-Feb-18 0 XX 25616.8 25720 25575 25687.5 25687.5 844 8658.98 80880 4080 5-Jan-18
FUTIDX BANKNIFTY 28-Mar-18 0 XX 25663.8 25767.05 25635 25738.95 25738.95 66 678.38 4200 1280 5-Jan-18
OPTIDX BANKNIFTY 25-Jan-18 25400 CE 388.35 441.2 355.25 418.5 418.5 1065 10988.48 51880 -7280 5-Jan-18
OPTIDX BANKNIFTY 25-Jan-18 25500 CE 318 373.3 293.8 353.85 353.85 9110 94123.35 363760 5320 5-Jan-18
OPTIDX BANKNIFTY 25-Jan-18 25600 CE 263.95 319.2 245.75 296.65 296.65 1945 20133.22 55960 3080 5-Jan-18
OPTIDX BANKNIFTY 25-Jan-18 25400 PE 224.5 238 180.55 190.35 190.35 1738 17805.51 26800 2120 5-Jan-18
OPTIDX BANKNIFTY 25-Jan-18 25500 PE 272.1 279.95 212.25 227.6 227.6 10552 108693.13 424360 28840 5-Jan-18
OPTIDX BANKNIFTY 25-Jan-18 25600 PE 317.7 327.15 252.65 265.95 265.95 1232 12761.12 33200 8560 5-Jan-18
我想在名為fut_close的optidx數據幀中添加一個新列,該列的值基於futidx數據幀的close1值,其中符號,expiry_dt和timestamp1的值相同。 如果沒有匹配項,我想將其設置為零。
謝謝!
我相信你需要drop_duplicates
在第一排futidx
按列cols
,然后merge
左加入,最后更換NaN
由s 0
:
cols = ['SYMBOL', 'EXPIRY_DT', 'TIMESTAMP1']
futidx = futidx.drop_duplicates(cols)[cols + ['CLOSE1']]
optidx = pd.merge(optidx, futidx, on=cols, how='left', suffixes=('','_fut'))
optidx['CLOSE1_fut'] = optidx['CLOSE1_fut'].fillna(0)
print (optidx)
SYMBOL EXPIRY_DT STRIKE_PR OPTION_TYP OPEN1 HIGH LOW CLOSE1 \
0 BANKNIFTY 2018-01-25 25400 CE 388.35 441.20 355.25 418.50
1 BANKNIFTY 2018-01-25 25500 CE 318.00 373.30 293.80 353.85
2 BANKNIFTY 2018-01-25 25600 CE 263.95 319.20 245.75 296.65
3 BANKNIFTY 2018-01-25 25400 PE 224.50 238.00 180.55 190.35
4 BANKNIFTY 2018-01-25 25500 PE 272.10 279.95 212.25 227.60
5 BANKNIFTY 2018-01-25 25600 PE 317.70 327.15 252.65 265.95
SETTLE_PR CONTRACTS VAL_INLAKH OPEN_INT CHG_IN_OI TIMESTAMP1 \
0 418.50 1065 10988.48 51880 -7280 2018-01-05
1 353.85 9110 94123.35 363760 5320 2018-01-05
2 296.65 1945 20133.22 55960 3080 2018-01-05
3 190.35 1738 17805.51 26800 2120 2018-01-05
4 227.60 10552 108693.13 424360 28840 2018-01-05
5 265.95 1232 12761.12 33200 8560 2018-01-05
CLOSE1_fut
0 25636.5
1 25636.5
2 25636.5
3 25636.5
4 25636.5
5 25636.5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.