代码之家  ›  专栏  ›  技术社区  ›  David Ricardo Menacho Vadillo

从另一个数据帧和Pandas数据帧中的公式列表创建数据帧

  •  1
  • David Ricardo Menacho Vadillo  · 技术社区  · 1 年前

    我有以下列表和数据帧:

    import pandas as pd
    
    df = pd.DataFrame({
        'name': ['alice','bob','charlie'],
        'a0': [25,26,27],
        'b0': [10,11,12],
        'c0': [3,4,5],
    })
    
    formul=['a0+b0','a0-c0','b0*c0','a0+c0']
    

    由此,我想构建一个新的数据帧,其中第一列是原始列,其他列根据列表中的操作进行修改:

    name    a0+b0 a0-c0 b0*c0 a0+c0
    alice      35    22    30    28
    bob        37    22    44    30
    charlie    39    22    60    32
    

    我已经用R开发了这个公式,但现在我想把它翻译成python:

    Formula<-strsplit(formul, split=",")[[1]]
    df<-as.data.frame(cbind(as.numeric(df$Name),sapply(Formula, function(x) with(df, eval(parse(text = x))))))
    

    当做

    1 回复  |  直到 1 年前
        1
  •  0
  •   mozway    1 年前

    你可以合并 assign 和 eval :

    out = df.assign(**{s: lambda x: x.eval(s) for s in formul})
    

    输出:

          name  a0  b0  c0  a0+b0  a0-c0  b0*c0  a0+c0
    0    alice  25  10   3     28     28     28     28
    1      bob  26  11   4     30     30     30     30
    2  charlie  27  12   5     32     32     32     32
    

    或者,对于一个新的 DataFrame :

    tmp = df.set_index('name')
    out = pd.DataFrame({s: tmp.eval(s) for s in formul})
    
    # or
    
    out = (pd.DataFrame({s: df.eval(s) for s in formul})
             .set_axis(df['name'])
          )
    

    输出:

             a0+b0  a0-c0  b0*c0  a0+c0
    name                               
    alice       35     22     30     28
    bob         37     22     44     30
    charlie     39     22     60     32