2016-08-02 11 views
1

私は2つのパンダデータフレーム(XとY)を持っており、3番目(Z)にブール値を設定しようとしています。 Xの軸とYの列/構成要素との間の相互関係。ネストされたループを介してこれを行うことしかできず、コードは私のおもちゃの例では機能するが、実際のデータセットに対しては遅すぎる。他のデータフレームの列ヘッダーメンバーシップに基づいて(日付別)pandasデータフレームのブール値を設定する

# define X, Y and Z 
idx=pd.date_range('2016-1-31',periods=3,freq='M') 
codes = list('ABCD') 
X = np.random.randn(3,4) 
X = pd.DataFrame(X,columns=codes,index=idx) 

Y = [['A','A','B'],['C','B','C'],['','C','D']] 
Y = pd.DataFrame(Y,columns=idx) 

Z = pd.DataFrame(columns=X.columns, index=X.index) 

この例では、XのインデックスがYの列と一致しています。実際の例では、Yの列はXのインデックスのサブセットです。

Zの軸はXと一致します。次のように私はZの列ヘッダは、ヘッダとYの欄にZ.私の作業のコードのインデックスと等しい場合はtrueとZの要素を移入するためにされたい:

for r in Y: 
    for c in Z: 
     Z.loc[r,c] = c in Y[r].values 

をコードはかなりきれいで、短いですが、より大きなデータセットで実行するには時間がかかります。私は同じ方法をもっと速く達成するためのベクトル化された方法があることを期待しています。

すべてのヘルプは大

おかげでいただければ幸いです!

答えて

1

stackメソッドを使用できます。ここでは、DataFrameの値を列と列に変換してDataFramesの値にします。最終テストnotnullによってNaN

print (Y.replace({'':np.nan}) 
     .stack() 
     .reset_index(0) 
     .set_index(0, append=True) 
     .squeeze() 
     .unstack() 
     .rename_axis(None, axis=1) 
     .notnull()) 

       A  B  C  D 
2016-01-31 True False True False 
2016-02-29 True True True False 
2016-03-31 False True True True 

pivotのもう一つの解決策:

print (Y.replace({'':np.nan}) 
     .stack() 
     .reset_index(name='a') 
     .pivot(index='level_1', columns='a', values='level_0') 
     .rename_axis(None, axis=1) 
     .rename_axis(None)   
     .notnull()) 

       A  B  C  D 
2016-01-31 True False True False 
2016-02-29 True True True False 
2016-03-31 False True True True 

コメントによるEDIT:

使用reindexインデックスがユニークで、その後Falseによってfillna場合:

import pandas as pd 
import numpy as np 

# define X, Y and Z 
idx=pd.date_range('2016-1-31',periods=5,freq='M') 
codes = list('ABCD') 
X = np.random.randn(5,4) 
X = pd.DataFrame(X,columns=codes,index=idx) 

Y = [['A','A','B'],['C','B','C'],['','C','D']] 
Y = pd.DataFrame(Y,columns=idx[:3]) 
Z = pd.DataFrame(columns=X.columns, index=X.index) 

print (X) 
        A   B   C   D 
2016-01-31 0.810348 -0.737780 -0.523869 -0.585772 
2016-02-29 -1.126655 -0.494999 -1.388351 0.460340 
2016-03-31 -1.578155 0.950643 -1.699921 1.149540 
2016-04-30 -2.320711 1.263740 -1.401714 0.090788 
2016-05-31 1.218036 0.565395 0.172278 0.288698 

print (Y) 
    2016-01-31 2016-02-29 2016-03-31 
0   A   A   B 
1   C   B   C 
2      C   D 

print (Z) 
       A B C D 
2016-01-31 NaN NaN NaN NaN 
2016-02-29 NaN NaN NaN NaN 
2016-03-31 NaN NaN NaN NaN 
2016-04-30 NaN NaN NaN NaN 
2016-05-31 NaN NaN NaN NaN 
Y1 = Y.replace({'':np.nan}) 
     .stack() 
     .reset_index(name='a') 
     .pivot(index='level_1', columns='a', values='level_0') 
     .rename_axis(None, axis=1) 
     .rename_axis(None) 
     .notnull() 
print (Y1) 
       A  B  C  D 
2016-01-31 True False True False 
2016-02-29 True True True False 
2016-03-31 False True True True 

print (Y1.reindex(X.index).fillna(False)) 
       A  B  C  D 
2016-01-31 True False True False 
2016-02-29 True True True False 
2016-03-31 False True True True 
2016-04-30 False False False False 
2016-05-31 False False False False 
+0

ありがとうございます。私はZがXと同じ軸を持つようにしたいという点で残っている問題が1つあります(Yの軸はサブセットです)。パネル内でXとZのデータフレームを作成すると、これはNaNによって設定された残りの要素と自動的に発生します。パネルを使用していない場合、上記の結果をXと同じ軸にどのように伸ばしますか?たとえば、Xに索引に2行が追加されている場合 – tmasters

関連する問題