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

时间:2016-10-24 14:56:56

标签: python pandas dataframe

我在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

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

2 个答案:

答案 0 :(得分:6)

如果需要,请转换“周”。使用to_datetimeIn [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 dtype然后您只需使用dt.day比较日属性,并将其用作np.where的条件:

#!/bin/bash
echo "invoking x/X_FE with $1"
sh /opt/xyz/x/X_FE.sh $1

echo "invoking x/X_BE with $1"
sh /opt/xyz/x/X_BE.sh $1

echo "invoking y/Y_FE with $1"
sh /opt/xyz/y/Y_FE.sh $1

echo "invoking x/Y_BE with $1"
sh /opt/xyz/y/Y_BE.sh $1

echo "invoking z/Z_FE with $1"
sh /opt/xyz/z/Z_BE.sh $1

答案 1 :(得分:0)

您可以使用apply

这适用于您的用例:

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

这将迭代每一行(axis=1),并检查day值。如果小于7,则该值为&#39; y&#39;否则将为&#39; n&#39;。

此输出(例如):

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

此外,因为你已经有了#34;一天&#34;专栏,你可以直接使用它,避免申请:

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