我想执行以下操作(伪代码):
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 :(得分:2)
你想要
df['flag'] = ((df['date'] > df['begin']) & (df['date'] < df['end'])).astype(int)
假设日期是日期时间,并且您的开始和结束是日期字符串,这应该有效
这个问题:
df['flag'] = df['flag'].apply(lambda x:x if (df['begin'] < df['date'] and df['date'] < df['end']) else 0)
首先if
不了解如何处理布尔数组因此错误,另外要比较多个条件,你应该使用按位运算符&
,|
和{{ 1}}分别用于~
,and
和or
。此外,由于运算符优先级,多个条件必须括在括号not
所以()
将返回一个布尔系列,然后您可以使用((df['date'] > df['begin']) & (df['date'] < df['end']))
转换类型,将astype(int)
转换为True
,将1
转换为{{1 }}