根据另一个数据帧的列匹配填充新的数据框列

时间:2018-01-14 07:59:08

标签: python pandas

所以我有一个数据帧对象(bhavcopy),我是通过读取CSV文件创建的。此数据框对象有多种类型,我必须根据一列(仪器)插入到不同的表中。

所以,在下面的代码中,我使用lambda函数从其他数据帧中获取值。(我试图根据futidx数据帧中的'close1'列在optidx数据帧中创建一个新列,与“optidx”数据帧中的“符号”,“Expiry_dt”,“Timestamp1”具有相同的值。

    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_close的新列,其值基于futidx数据帧的close1值,其值与symbol,expiry_dt和timestamp1相同。如果没有匹配,我想将其设为零。

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为futidx中的第一行cols需要drop_duplicatesNaN列需要merge,左{@} {{3}}需要{{3}} {{3}} 1}}:

0