python pandas dataframe从其他列的单元格创建新列

时间:2017-01-28 07:33:47

标签: python pandas dataframe

我有一个像这样的数据框......

         a_return    b_return  bc_ratio instrument_holding 
0             NaN         NaN -0.165286                  a 
1        0.996474    1.013166 -0.164637                  a   
2        0.997730    0.993540 -0.170058                  a   
3        1.024294    1.024318 -0.184530                  a   
4        1.019071    1.047297 -0.148644                  a   
5        0.992243    1.008210 -0.188752                  a    
6        1.010331    1.039020 -0.098413                  a   
7        0.989542    0.991899  0.025051                  b   
8        1.005197    1.002527 -0.025051                  b 
9        0.990755    1.002352 -0.099800                  a  
10       1.006241    0.998375 -0.078643                  b

我想添加一个名为'log_ret'的列,其中'a_return'或'b_return'中的值是根据'instrument_holding'列中的值使用的。像这样......

         a_return    b_return  bc_ratio instrument_holding   log_ret  
0             NaN         NaN -0.165286                  a       NaN  
1        0.996474    1.013166 -0.164637                  a  0.996474  
2        0.997730    0.993540 -0.170058                  a  0.997730  
3        1.024294    1.024318 -0.184530                  a  1.024294  
4        1.019071    1.047297 -0.148644                  a  1.019071  
5        0.992243    1.008210 -0.188752                  a  0.992243  
6        1.010331    1.039020 -0.098413                  a  1.010331  
7        0.989542    0.991899  0.025051                  b  0.991899  
8        1.005197    1.002527 -0.025051                  b  1.002527  
9        0.990755    1.002352 -0.099800                  a  0.990755  
10       1.006241    0.998375 -0.078643                  b  0.998375 

如您所见,如果'instrument_holding'的行值为'a','log_ret'的值为'a_return',如果'instrument_holding'的值为'b','log_ret'的值为'b_return'。

我认为可以这样完成......

df["log_ret"] = df[df["instrument_holding"] + "_return"]

事实并非如此。谢谢你的任何建议!

3 个答案:

答案 0 :(得分:8)

一种可能性是在 instrument_holding 等于"a"的条件下使用np.where,并在 a_return 列中返回相应的值,如果条件满足,否则另一列。

稍后使用DF.assign分配新列 log_ret

df.assign(log_ret=np.where(df.instrument_holding == 'a', df.a_return, df.b_return))

enter image description here

答案 1 :(得分:7)

  • 使用map更改instrument_holding
  • 中的值
  • 使用lookup
df.assign(
    log_return=df.lookup(df.index, df.instrument_holding.map('{}_return'.format)))

    a_return  b_return  bc_ratio instrument_holding  log_return
0        NaN       NaN -0.165286                  a         NaN
1   0.996474  1.013166 -0.164637                  a    0.996474
2   0.997730  0.993540 -0.170058                  a    0.997730
3   1.024294  1.024318 -0.184530                  a    1.024294
4   1.019071  1.047297 -0.148644                  a    1.019071
5   0.992243  1.008210 -0.188752                  a    0.992243
6   1.010331  1.039020 -0.098413                  a    1.010331
7   0.989542  0.991899  0.025051                  b    0.991899
8   1.005197  1.002527 -0.025051                  b    1.002527
9   0.990755  1.002352 -0.099800                  a    0.990755
10  1.006241  0.998375 -0.078643                  b    0.998375

答案 2 :(得分:3)

使用apply。这不是最神奇的方式,但它非常灵活。

def select(row):
    if row['instrument_holding'] == 'a':
        return row['a_return']
    else:
        return row['b_return']

df['log_ret'] = df.apply(select, axis=1)