2016-11-25 50 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

需要一个小的编辑,但它的工作,谢谢。并感谢您的解释。 –