2014-01-21 113 views
14

我有這樣一個數據幀:大熊貓:更新值如果3列條件都滿足

In[1]: df 
Out[1]: 
     A  B  C   D 
1 blue red square  NaN 
2 orange yellow circle  NaN 
3 black grey circle  NaN 

,我想更新列d時,滿足3個條件。例如:

df.ix[ np.logical_and(df.A=='blue', df.B=='red', df.C=='square'), ['D'] ] = 'succeed' 

它適用於前兩個條件,但它並沒有爲第三個工作,即:

df.ix[ np.logical_and(df.A=='blue', df.B=='red', df.C=='triangle'), ['D'] ] = 'succeed' 

具有完全相同的結果:

In[1]: df 
Out[1]: 
     A  B  C   D 
1 blue red square  succeed 
2 orange yellow circle  NaN 
3 black grey circle  NaN 
+0

呢'df.ix [(df.A == '藍色')(df.B == '紅')(DF。 C =='square'),'D'] ='success''工作? – EdChum

回答

17

你可以試試這個:

df[ (df.A=='blue') & (df.B=='red') & (df.C=='square') ]['D'] = 'succeed' 
+0

是的,它的工作原理。雖然我仍然沒有得到「numpy.logical_and」和「&」之間的區別。謝謝 –

+0

你也可以在'df [(df.A =='blue')| (df.B =='red')]' – TimRich

+8

如果在使用上面的解決方案時出現警告'一個值試圖從DataFrame的一個片的副本上設置,那麼執行此操作:'df.loc [(df .A =='blue')&(df.B =='red')&(df.C =='square'),'D'] ='succeed'' – Shams

1

logical_and的第三個參數是分配用於存儲結果的數組。

目前,@TimRich提供的方法可能是最好的。在熊貓0.13(開發中)中,有一個新的實驗方法query。嘗試一下!

2

使用

df[ (df.A=='blue') & (df.B=='red') & (df.C=='square') ]['D'] = 'succeed' 

,給出以下警告實現這似乎是

df.loc[(df['A'] == 'blue') & (df['B'] == 'red') & (df['B'] == 'square'),'label'] = 'M5' 
2

你可以嘗試的

/usr/local/lib/python2.7/dist-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

更好的辦法:

df['D'] = np.where((df.A=='blue') & (df.B=='red') & (df.C=='square'), 'succeed') 

這個答案可能會提供一個詳細的答案,你的問題: Update row values where certain condition is met in pandas

相關問題