2016-09-21 97 views
1

有沒有辦法通過匹配名稱,分劃板和單元轉換來填充NaN的值爲test=default用另一個查找表填充NaN

enter image description here

enter image description here

在 「測試」 列中的幾個變量: enter image description here

有沒有辦法更新來自其他行的值?因爲數據類型「do」會比int更高的優先級,並丟棄「do」數據行?

數據:
測試數據類型名稱值光罩cell_rev
默認的int 0×45 CR1
默認的int 0xCB CR3
默認一切都做得那麼0.68 CR1

我想獲得:

測試數據類型名稱值分劃板cell_rev
默認int s 0.68 CR1
默認int s 0xCB CR3

+1

您應該將示例包含爲文本,而不是屏幕截圖。 – IanS

回答

2

您可以通過stack使用set_indexunstack重塑,然後ffill用於添加缺少的價值觀和最後重塑原始:通過評論

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 

編輯:

使用merge由子df1通過boolean indexing創造然後填寫NaNcombine_firstfillna

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具有「default,etlc,Jlc和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'] 

我覺得有一個更有效的解決方案,但這應該工作。