基于另一个datafram的列匹配填充新的dataframe列

2024-06-25 06:06:42 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我有一个dataframe对象(bhavcopy),它是通过读取CSV文件创建的。这个dataframe对象有多种类型,我必须根据一列(仪器)将它们插入不同的表中。你知道吗

因此,在下面的代码中,我使用lambda函数从另一个数据帧获取值..(我尝试在optidx数据帧中基于futidx数据帧中的'close1'列创建一个新列,该列的'Symbol'、'Expiry\u 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

我想在optidx数据帧中添加一个名为fut\u close的新列,它的值基于futidx数据帧中的close1值,symbol、expiry\u dt和timestamp1的值相同。如果没有匹配,我想把它设为零。你知道吗

谢谢!你知道吗


Tags: 数据dtprsymboljanrowinstrumentexpiry
1条回答
网友
1楼 · 发布于 2024-06-25 06:06:42

我相信您需要^{}按列colsfutidx中的第一行,然后^{}使用left join,最后用0替换NaNs:

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  

相关问题 更多 >