2017-08-06 1 views
2

Für die folgende dfWie vergleicht man alle Spalten mit einer Spalte in Pandas?

   A  B  ..... THRESHOLD    
DATE          
2011-01-01  NaN  NaN .....  NaN 
2012-01-01 -0.041158 -0.161571 ..... 0.329038 
2013-01-01 0.238156 0.525878 ..... 0.110370 
2014-01-01 0.606738 0.854177 ..... -0.095147 
2015-01-01 0.200166 0.385453 ..... 0.166235 

Ich habe eine Anzahl von N Spalten wie A, B, C .... mit THRESHOLD und gibt das Ergebnis wie

df['A_CALC'] = np.where(df['A'] > df['THRESHOLD'], 1, -1) 
df['B_CALC'] = np.where(df['B'] > df['THRESHOLD'], 1, -1) 

Wie bewirbt man die oben vergleichen für alle Spalten (A, B, C ...) ohne explizit eine Anweisung pro Spalte zu schreiben?

Antwort

5

Sie können df.apply verwenden:

In [670]: df.iloc[:, :-1]\ 
      .apply(lambda x: np.where(x > df.THRESHOLD, 1, -1), axis=0)\ 
      .add_suffix('_CALC') 
Out[670]: 
      A_CALC B_CALC 
Date      
2011-01-01  -1  -1 
2012-01-01  -1  -1 
2013-01-01  1  1 
2014-01-01  1  1 
2015-01-01  1  1 

Wenn THRESHOLDnicht Ihre letzte Spalte ist, dann würden Sie besser dran mit

df[df.columns.difference(['THRESHOLD'])].apply(lambda x: np.where(x > df.THRESHOLD, 1, -1), axis=0).add_suffix('_CALC') 
+1

Ich denke, du könntest 'where' Funktion in' pandas' verwenden, anstatt von 'numpy', immer noch eine nette Lösung – Wen

0

Würde Folgendes ausreichen?

for col in df.columns.values: 
    if col!= 'THRESHOLD': 
     newname = col+'_CALC' 
     df[newname] = np.where(df[col] > df['THRESHOLD'], 1, -1) 
+0

Die Verwendung einer for-Schleife beim Arbeiten mit Pandas-Säulen wird niemals empfohlen. –

+0

Autsch! Warum das? Ich habe nie ein Problem damit gehabt, obwohl ich mir vorstellen kann, dass es ziemlich zeitaufwendig ist ... – durbachit

+0

Genau weil es zeitraubend ist:] –

1

Oder vielleicht können Sie dies versuchen, durch Verwendung von subtract, sollte schneller sein als apply

(df.drop(['THRESHOLD'],axis=1).subtract(df.THRESHOLD,axis=0)>0)\ 
    .astype(int).replace({0:-1}).add_suffix('_CALC') 
Verwandte Themen