Python在数据帧列上测试true/false条件并在新列中返回输出



我对Python编程非常陌生,所以我试图掌握一些基础知识-任何输入都是非常感谢的。

我有一个每周日期的列表,我试图运行一个'if'语句的日子,即,如果天数小于7,创建一个列与一个因子x,否则创建一个因子y -如下表:

    week        day check       factor
0   2017-01-08  8   False       x
1   2017-01-15  15  False       x
2   2017-01-22  22  False       x
3   2017-01-29  29  False       x
4   2017-02-05  5   True        y

我尝试了下面的代码:

if df['day'] <7 :
    factor=weeks['day']/7
else:
    ....

并得到一个错误:

ValueError: The truth value of a Series is ambiguous

,我已经研究过了,并且理解上面的代码试图测试整个列,因此不可能有明确的真/假响应。我已经看到了一些关于所有/任何的评论,但这些也没有给我我正在寻找的回应。是否有一种方法可以测试列中的每个项目并根据值返回不同的输出?

如果需要使用to_datetime转换'week'列datetime dtype,那么您可以使用dt.day比较day属性,并将其用作np.where的条件:

In [47]:
df['week'] = pd.to_datetime(df['week'])
df['factor'] = np.where(df['week'].dt.day < 7, 'y', 'x')
df
Out[47]:
        week  day  check factor
0 2017-01-08    8  False      x
1 2017-01-15   15  False      x
2 2017-01-22   22  False      x
3 2017-01-29   29  False      x
4 2017-02-05    5   True      y

您可以使用apply

这应该适用于您的用例:

df['factor'] = df.apply(lambda row: "y" if row['day'] < 7 else "x", axis=1)

这将遍历每一行(axis=1),并检查day的值。如果小于7,则值为"y",否则为"n"。

输出(例如):

    check  day        week factor
 0  False    8  2017-01-08      x
 1   True    5  2017-02-05      y

同样,因为你已经有了一个"day"列,你可以直接使用它,避免apply:

msk = df['day'] < 7   # Series of True/False values based on condition
df[factor] = msk.replace([True, False], ['y', 'x']) #convert True/False to y/x

相关内容

最新更新