用Python Pandas DataFrame从其他列的单元格创建新列

7
我有一个像这样的数据框…
         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”的列,其中基于“instrument_holding”列的值使用“a_return”或“b_return”的值。就像这样...
         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个回答

8
一种可能的方法是使用np.where,在条件中判断instrument_holding是否等于"a",如果满足条件则返回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


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

非常有趣的方法! - MaxU - stand with Ukraine

4

使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接