2017-05-12 17 views
0

私は以下のマルチインデックスデータフレームを持っており、条件付きカラムをデータフレームに追加しようとしています。私の現在のコードはエラーを生成します。パンダのマルチインデックスデータフレームに条件付きカラムを追加する

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

データフレームは以下の通りです:

 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 

そして、私は「幅」と呼ばれるED12のcomdtyとXAU curncy指標のそれぞれについて、3番目の列を追加しようとしていますそのインデックスのPX_LAST列が> = MOV_AVG_200Dかどうかに応じて1または0が返されます。以下

コード:

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

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

ありがとう!

+0

どう 'についてのデータ[(ティッカー '幅')] = np.where(データ[(ティッカー、 'PX_LAST')]> =データを[(ティッカー、 'MOV_AVG_200D')]、1,0) '? – jezrael

+0

'data'が' np'に変更されました(最初に 'numpyをnpにインポートする必要があります) – jezrael

+0

- ありがとうございました – GPH

答えて

0

最も単純にはastypeによってintにブールマスクを変換です:

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 

またはリシェイプ用stackを使用し、booelanマスクのastypeでカラムを追加し、swaplevel + sort_indexunstackバック再構築:

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

これらの4つのc olumns、あなただけの以下のような2つの幅の列を挿入することができます

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

ありがとうございました。 – GPH

関連する問題