代码之家  ›  专栏  ›  技术社区  ›  Yuca

pandas使用拆分列作为新索引设置索引

  •  1
  • Yuca  · 技术社区  · 6 年前

    我有一个从第三方获得的数据帧:

    r = get_finance_rate([eq_opt_px.index[0],vol_opt_px.index[0]], expiry)
    

    r:

        ticker                          field           value
    0   SPX US 08/17/2018 C2830.0 Index OPT_FINANCE_RT  2.004648
    1   VXX US 08/17/2018 C27.0 Index   OPT_FINANCE_RT  2.03248
    

    由于输出返回的格式不符合我的需要,我想重置索引。我要做的最明显的解决办法是

    r['aux id'] = [x.split()[0] for x in r['ticker']]
    r = r.set_index('aux id')
    

    结果:

        ticker                          field           value
    SPX SPX US 08/17/2018 C2830.0 Index OPT_FINANCE_RT  2.004648
    VXX VXX US 08/17/2018 C27.0 Index   OPT_FINANCE_RT  2.03248
    

    但是我想做一些类似的事情

    r = get_finance_rate([eq_opt_px.index[0],vol_opt_px.index[0]], expiry).set_index('ticker'.split(' ')[0])
    

    前一条指令不执行拆分

    ticker                          field           value
    SPX US 08/17/2018 C2830.0 Index OPT_FINANCE_RT  2.004648
    VXX US 08/17/2018 C27.0 Index   OPT_FINANCE_RT  2.03248
    

    有没有这样一种方法可以在不创建临时列的情况下完成我想要的任务?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Scott Boston    6 年前

    试试这一行:

    r = get_finance_rate([eq_opt_px.index[0],vol_opt_px.index[0]], expiry)\
           .pipe(lambda x: x.set_index(x.ticker.str.split().str[0]).rename_axis('aux_id')
    

    IIUC,你必须分两步来做:

    r = get_finance_rate([eq_opt_px.index[0],vol_opt_px.index[0]], expiry)
    r = r.set_index(r.ticker.str.split().str[0]).rename_axis('aux_id')
    

    输出:

                                     ticker           field     value
    aux_id                                                           
    SPX     SPX US 08/17/2018 C2830.0 Index  OPT_FINANCE_RT  2.004648
    VXX       VXX US 08/17/2018 C27.0 Index  OPT_FINANCE_RT  2.032480
    
        2
  •  1
  •   mad_    6 年前
    df.set_index=df.ticker.apply(lambda x: x.split(' ')[0])
    df.ticker=df.ticker.apply(lambda x: x.split(' ')[1:])
    
        3
  •  1
  •   W Stokvis    6 年前
    r.assign(aux_id = lambda x: x['ticker'].str.split(expand = True)[0])
        .set_index('aux_id')
                                    ticker           field     value
    aux_id
    SPX   SPX US 08/17/2018 C2830.0  Index  OPT_FINANCE_RT  2.004648
    VXX   VXX US 08/17/2018 C27.0    Index  OPT_FINANCE_RT  2.032480