2017-12-08 19 views
0

refpd.DataFramexxxとし、NaNをスキップして行列を埋めたいとします。行列をpandas.DataFrameのデータで塗りつぶすNaN

print xxx 
OUT >> 
    intensity name rowtype1 rowtype2 
0  100 A   1  4.0 
1  200 A   2  NaN 
2  300 B   3  5.0 

そして私は2 rowtypeを有するref[rowtype,col] = intensityによって行列を埋めます。

ref = np.zeros(shape=(7,4)) 
for idx, inte, name, r1, r2 in xxx.itertuples(): 
    ref[r1,idx] = inte 
    ref[r2,idx] = inte # error because of NaN in rowtype2 

print ref 

ここでNaNをスキップできますか? drop.na()を使用する方法はわかりますが、rowtype2intensityの新しいデータフレームを作成する必要があります。私は速く簡単な方法を持っています。NaNintensity = 200に、次にrowtype2 = 5intensity = 300にジャンプするだけです。


追加情報:ここでは

1)xxx

prot = ['A','A','B'] 
calc_m = [1,2,3] 
calc_m2 = [4, np.nan,5] 
inte = [100,200,300] 
xxx = pd.DataFrame({'name' : pd.Series(prot), 
        'rowtype1': pd.Series(calc_m), 
        'rowtype2': pd.Series(calc_m2), 
        'intensity': pd.Series(inte) 
        }) 

答えて

1

あなたはmeltを使用してこのオプションを使用することができ、その後、あなたに

array([[ 0., 0., 0., 0.], 
     [ 100., 0., 0., 0.], 
     [ 0., 200., 0., 0.], 
     [ 0., 0., 300., 0.], 
     [ 100., 0., 0., 0.], 
     [ 0., 0., 300., 0.], 
     [ 0., 0., 0., 0.]]) 
を与えるforループ

set = xxx.reset_index().melt(['intensity','index'],['rowtype1','rowtype2']).dropna() 

ref[set.value.astype(int).values,set['index'].values] = set.intensity.values 

を使用して対numpyののインデックスを使用してrefのインデックスを設定します

0

を作成する方法である私は(私は完全にあなたが探しているものの行動理解してないんだけど、パンダのdropna)たとえば、rowtype2列のNaNを含むすべての行を削除するには、

xxx.dropna(subset=['rowtype2'],inplace=True) 

このようにして、rowtype2カラムにNaNを含む行だけをドロップします。

関連する問題