在其他专栏的条件下的旗子

时间:2016-11-25 11:05:07

标签: python pandas

我想执行以下操作(伪代码):

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的新手,在这里学习)

感谢。

1 个答案:

答案 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}}分别用于~andor。此外,由于运算符优先级,多个条件必须括在括号not

所以()将返回一个布尔系列,然后您可以使用((df['date'] > df['begin']) & (df['date'] < df['end']))转换类型,将astype(int)转换为True,将1转换为{{1 }}