2016-11-25 60 views
2

我想要做以下(僞代碼):國旗上其他列條件

for each row of my dataframe; 
    if the value of the cell "date" is between the values of the cells "begin" and "end", then write "1" in the cell "flag", 0 otherwise 

我試過如下:

df['flag'] = 1 
df['flag'] = df['flag'].apply(lambda x:x if (df['begin'] < df['date'] and df['date'] < df['end']) else 0) 
# (I'm coming from R...) 

我也得到:

The truth value of a Series is ambiguous 

我得到了Python告訴我的情況,即在這種情況下,它並不比較每行中單元格的內容,而是比較整列。

我怎樣才能得到我想要的? (該解決方案不必遵循相同的方法,我是Python的新手,在這裏學習)

謝謝。

+0

'的foreach DF中dataframe:\ n if df ['begin']

+0

'SyntaxError:invalid syntax'(指向第一個'df'部分) –

+0

'for'而不是'foreach'當然...對不起那 –

回答

2

你想

df['flag'] = ((df['date'] > df['begin']) & (df['date'] < df['end'])).astype(int) 

假設日期是datetime和你的開始和結束都是datestrings這應該工作

與此問題:

df['flag'] = df['flag'].apply(lambda x:x if (df['begin'] < df['date'] and df['date'] < df['end']) else 0) 

首先if不明白如何處理一個布爾型數組,從而產生錯誤,另外爲了比較多個條件,您應該使用按位運算符分別爲,|~,分別爲and,ornot。此外,由於運算符優先級的多個條件必須用括號括起來()

所以((df['date'] > df['begin']) & (df['date'] < df['end']))會返回一個布爾值系列,那麼你就可以投用astype(int)True轉換爲1False類型0

+0

需要一個小的編輯,但它的工作,謝謝。並感謝您的解釋。 –