2017-01-28 13 views
7

ich einen Datenrahmen wie dieses ...Python Pandas Dataframe neue Spalte erstellen aus anderen Spalten Zellen

  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 

Ich möchte eine Spalte hinzuzufügen, genannt ‚log_ret‘, wo der Wert von ‚a_return‘ oder ‚b_return 'wird basierend auf dem Wert in der Spalte' instrument_holding 'verwendet. So ...

  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 

Wie Sie sehen können, wenn der Wert der Zeile für ‚instrument_holding‘ ist ‚a‘, ‚log_ret‘ den Wert von ‚a_return‘ und wenn ‚instrument_holding‘ den Wert ‚b ',' log_ret 'hat den Wert von' b_return '.

Ich dachte, es wie dies erreicht werden könnte ...

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

Das ist nicht der Fall ist. Danke für Anregungen!

Antwort

7
  • Verwendung map auf Werte in instrument_holding
  • lookup Verwendung ändern

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

Sehr interessanter Ansatz! – MaxU

3

Verwenden Sie apply. Das ist nicht die magischste Art, aber es ist sehr flexibel.

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

Eine Möglichkeit wäre np.where unter der Bedingung zu verwenden, bei instrument_holding"a" entspricht und den entsprechenden Wert in der a_return Spalte zurückkehrt, wenn die Bedingung erfüllt ist, sonst die andere Säule.

Verwenden Sie DF.assign, um später die Zuordnung zu einer neuen Spalte log_ret vorzunehmen.

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

enter image description here

Verwandte Themen