2017-01-28 38 views
7

Tôi có một dataframe như thế này ...gấu trúc python dataframe tạo cột mới từ cột khác tế bào

  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 

Tôi muốn thêm một cột gọi là 'log_ret' trong đó giá trị từ 'a_return' hoặc 'b_return 'được sử dụng dựa trên giá trị trong cột' instrument_holding '. Như thế này ...

  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 

Như bạn có thể thấy, nếu giá trị của hàng cho 'instrument_holding' là 'a', 'log_ret' có giá trị từ 'a_return' và nếu 'instrument_holding' có giá trị 'b ',' log_ret 'có giá trị từ' b_return '.

tôi nghĩ rằng nó có thể được thực hiện như thế này ...

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

Đó không phải là trường hợp. Cảm ơn mọi lời đề nghị!

Trả lời

7
  • sử dụng map để thay đổi giá trị trong instrument_holding
  • sử dụng 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 
+0

cách tiếp cận Rất thú vị! – MaxU

3

Sử dụng apply. Đây không phải là cách kỳ diệu nhất, nhưng nó rất linh hoạt.

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

Một khả năng sẽ được sử dụng np.where với điều kiện trong đó instrument_holding bằng "a" và trả lại giá trị tương ứng trong a_return cột nếu điều kiện là hài lòng, nếu không cột khác.

Sử dụng DF.assign để chuyển nhượng một cột mới, log_ret sau đó.

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

enter image description here

Các vấn đề liên quan