2017-05-12 3 views
0

Ich habe den folgenden Multi-Index-Datenrahmen und habe Mühe, dem Datenrahmen eine bedingte Spalte hinzuzufügen. Mein aktueller Code erzeugt den Fehler:Hinzufügen einer bedingten Spalte zu einem Multiindex-Dataframe des Panda

ValueError: Wrong number of items passed 4, placement implies 1 

Der Datenrahmen ist unter:

 ed12 comdty    xau curncy    
      PX_LAST MOV_AVG_200D PX_LAST MOV_AVG_200D 
date              
1997-10-06  93.75  93.2863  332.55  339.45 
1997-10-07  93.78  93.2881  331.45  339.27 
1997-10-08  93.65  93.2892  333.25  339.09 
1997-10-09  93.64  93.2904  327.75  338.90 
1997-10-10  93.59  93.2913  329.65  338.74 

Und ich versuche, eine dritte Spalte für jede der ED12 Comdty und XAU Curncy Indizes „BREIT“ genannt hinzuzufügen, die ist eine 1 oder 0, abhängig davon, ob die Spalte PX_LAST für diesen Index> = MOV_AVG_200D ist.

-Code unten:

for ticker in data.columns.levels[0]: 

data[(ticker,'BREADTH')] = data.where(data[(ticker,'PX_LAST')]>=data[(ticker,'MOV_AVG_200D')],1,0) 

Dank!

+0

Was ist 'data [(Ticker, 'BREIT')] = np.where (data [(Ticker, 'PX_LAST')]> = Daten [(Ticker, 'MOV_AVG_200D')], 1,0) '? – jezrael

+0

'data' wurde in' np' geändert (brauche zuerst 'import numpy als np') – jezrael

+0

das funktionierte wie ein Zauber - danke – GPH

Antwort

0

Simpliest ist boolean Maske int von astype konvertieren:

import pandas as pd 

for ticker in data.columns.levels[0]: 
    mask = data[(ticker,'PX_LAST')]>=data[(ticker,'MOV_AVG_200D')] 
    data[(ticker,'BREADTH')] = mask.astype(int) 

data = data.sort_index(axis=1,ascending=[True, False]) 
print (data) 
      ed12 comdty      xau curncy      
       PX_LAST MOV_AVG_200D BREADTH PX_LAST MOV_AVG_200D BREADTH 
date                  
1997-10-06  93.75  93.2863  1  332.55  339.45  0 
1997-10-07  93.78  93.2881  1  331.45  339.27  0 
1997-10-08  93.65  93.2892  1  333.25  339.09  0 
1997-10-09  93.64  93.2904  1  327.75  338.90  0 
1997-10-10  93.59  93.2913  1  329.65  338.74  0 

Oder stack für reshape verwenden, fügen Spalte mit astype von booelan Maske und dann neu zu gestalten zurück durch unstack mit swaplevel + sort_index:

data = data.stack(level=0) 
data['BREADTH'] = (data['PX_LAST'] >= data['MOV_AVG_200D']).astype(int) 
data = data.unstack().swaplevel(0,1,axis=1).sort_index(axis=1, ascending=[True, False]) 
print (data) 
      ed12 comdty      xau curncy      
       PX_LAST MOV_AVG_200D BREADTH PX_LAST MOV_AVG_200D BREADTH 
date                  
1997-10-06  93.75  93.2863  1  332.55  339.45  0 
1997-10-07  93.78  93.2881  1  331.45  339.27  0 
1997-10-08  93.65  93.2892  1  333.25  339.09  0 
1997-10-09  93.64  93.2904  1  327.75  338.90  0 
1997-10-10  93.59  93.2913  1  329.65  338.74  0 
0

Wenn Sie nur diese 4 c olumns, können Sie einfach fügen Sie die 2 BREIT Spalten wie unten:

df.insert(2,('ed12 comdty','BREADTH'),(df.iloc[:,0] > df.iloc[:,1]).astype(int)) 

df.insert(len(df.columns),('xau curncy','BREADTH'),(df.iloc[:,-2] > df.iloc[:,-1]).astype(int)) 

df 
Out[1495]: 
      ed12 comdty      xau curncy      
       PX_LAST MOV_AVG_200D BREADTH PX_LAST MOV_AVG_200D BREADTH 
Date                  
1997-10-06  93.75  93.2863  1  332.55  339.45  0 
1997-10-07  93.78  93.2881  1  331.45  339.27  0 
1997-10-08  93.65  93.2892  1  333.25  339.09  0 
1997-10-09  93.64  93.2904  1  327.75  338.90  0 
1997-10-10  93.59  93.2913  1  329.65  338.74  0 
+0

Danke - Ich könnte tatsächlich mehr als 4 Spalten haben, aber das war auch nützlich – GPH

Verwandte Themen