2017-01-28 16 views
7

Mam dataframe takiego ...python pandy dataframe utworzyć nową kolumnę z innych kolumn komórek

  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 

chcę dodać kolumnę o nazwie «log_ret», gdzie wartość z «a_return» lub „b_return "jest używane w oparciu o wartość w kolumnie" instrument_holding ". Tak ...

  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 

Jak widać, jeśli wartość wiersza dla „instrument_holding” to „a”, „log_ret” ma wartość od „a_return” a jeśli „instrument_holding” ma wartość „b ", log_ret" ma wartość z "b_return".

myślałem może to być osiągnięte tak ...

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

To nie jest przypadek. Dzięki za wszelkie sugestie!

Odpowiedz

7
  • użycie map zmienić wartości w instrument_holding
  • użytku 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

Bardzo ciekawe podejście! – MaxU

3

Użyj apply. To nie jest najbardziej magiczny sposób, ale jest bardzo elastyczny.

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

Jedną z możliwości jest użycie np.where na stan, w którym instrument_holding równa "a" i powrót odpowiednią wartość w kolumnie a_return jeśli warunek jest spełniony, inne drugiej kolumny.

Użyj DF.assign, aby wykonać przypisanie do nowej kolumny, log_ret później.

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

enter image description here