2016-09-21 12 views
1

NaNtest=defaultの値を入力する方法は、名前、レティクル、 "テスト" 列内のいくつかの変数を持つ別のルックアップテーブルでNaNを塗りつぶす

enter image description here

enter image description here

enter image description here

他の行から値を更新する方法はありますか?データ型 "do"はintより優先度が高く、 "do"データ行を削除するので、

データ:
テストデータ型の名前と値のレチクルcell_rev
デフォルトのint sの0x45 CR1
デフォルトのint sの0xCB CR3
デフォルトのやる0.68 CR1

私が取得したいのですが:

テストデータ型名値レチクルcell_rev
デフォルトint 0.68 CR1
デフォルトint 0xCB CR3

+1

例をスクリーンショットではなくテキストとして含める必要があります。 – IanS

答えて

2

あなたはffill、その後、再形成のためunstackset_indexを使用するためのstackによって元に欠損値と最後のリシェイプを追加することができます。

df = df.set_index(['name','value_old','reticle','test','cell_rev']) 
     .unstack() 
     .ffill() 
     .stack() 
     .reset_index() 

print (df) 
    name value_old reticle  test cell_rev value_new 
0 s  0x8E  A28 default  CR1  0x8C 
1 s  0x8E  A28 default  CR3  0x8E 
2 s  0x8E  A28  etlc  CR1  0x8C 
3 s  0x8E  A28  etlc  CR3  0x8E 

コメントによるEDIT:

使用mergeboolean indexingによって作成されたサブセットdf1でとNaNの値をcombine_firstまたはfillnaと入力します。

df1 = df.ix[df.test == 'default'] 
print (df1)  
     test name value_old reticle cell_rev value_new 
0 default s  0x8E  A28  CR1  0x8E 
1 default s  0x8E  A28  CR3  0x8C 

df2 = pd.merge(df, df1, how='left', on=['name','reticle','cell_rev'], suffixes=('','1')) 
print (df2) 
     test name value_old reticle cell_rev value_new test1 value_old1 \ 
0 default s  0x8E  A28  CR1  0x8E default  0x8E 
1 default s  0x8E  A28  CR3  0x8C default  0x8E 
2  etlc s  0x8E  A28  CR1  0x44 default  0x8E 
3  etlc s  0x8E  A28  CR3  0x44 default  0x8E 
4  mlc s  0x1E  A28  CR1  NaN default  0x8E 
5  mlc s  0x1E  A28  CR3  NaN default  0x8E 
6  slc s  0x2E  A28  CR1  NaN default  0x8E 
7  slc s  0x2E  A28  CR3  NaN default  0x8E 

    value_new1 
0  0x8E 
1  0x8C 
2  0x8E 
3  0x8C 
4  0x8E 
5  0x8C 
6  0x8E 
7  0x8C 
df['value_new'] = df2['value_new'].combine_first(df2['value_new1']) 
#df['value_new'] = df2['value_new'].fillna(df2['value_new1']) 
print (df) 
     test name value_old reticle cell_rev value_new 
0 default s  0x8E  A28  CR1  0x8E 
1 default s  0x8E  A28  CR3  0x8C 
2  etlc s  0x8E  A28  CR1  0x44 
3  etlc s  0x8E  A28  CR3  0x44 
4  mlc s  0x1E  A28  CR1  0x8E 
5  mlc s  0x1E  A28  CR3  0x8C 
6  slc s  0x2E  A28  CR1  0x8E 
7  slc s  0x2E  A28  CR3  0x8C 
+0

このソリューションはサンプルでうまく動作しますが、実際のデータは 'test'列の' default'と 'etlc'だけです。 – jezrael

+0

実際のデータで調べてくれてありがとう、jlcとklcの場合、testカラムに "default、etlc、Jlc and klc"があります。もしvalue_newがNANならば、NANはデフォルトからの値で満たされ、他の列(名前、レチクル、セル、回転) – user37970

+0

ソリューションはうまく動作しているかどうか? – jezrael

0
for i in range(len(df)): 
    if df.loc[i, 'value_new'] != df.loc[i, 'value_new']: 
     df.loc[i, 'value_new'] = df.loc[(df.test == 'default') & 
             (df.name == df.loc[i, 'name']) & 
             (df.reticle == df.loc[i, 'reticle']) & 
             (df.cell_rev == df.loc[i, 'cell_rev']), 
             'value_new'] 

私は、より効率的な解決策があると思うが、これは動作するはずです。

関連する問題