适当的pandas映射具有多个值的语法

时间:2017-05-20 16:03:56

标签: python pandas

我知道我几乎就在那里,但无法找出相当于以下代码的更快的语法:

def is_evening(df):
    lst = []
    for i in df.index:
        val = df["localized_time"][i]
        if val != 'NA':
            if val.hour >= 17 and val.hour <= 3:
                lst.append(1)
            else:
                lst.append(0)
        else:
            lst.append(-1)
    df["is_evening"] = lst
    return df

如果它只是两个值就很容易了,但是有了额外的条件和东西,有没有一种快速的方法来使用pandas map来做到这一点?

到目前为止我所拥有的:

mask = [df["localized_time"] != 'NA']
df["is_evening"] = df["is_evening"] = df["localized_time"][mask].apply(lambda x: 1 if (x.hour >= 17 and x.hour <= 23) else 0)
# Doesn't seem to work

有人可以帮帮我吗?谢谢! :)

1 个答案:

答案 0 :(得分:1)

是的肯定有:

def f(x):
    return int(x.hour >= 17 and x.hour <= 3) if x != 'NA' else -1

df["is_evening"] = df["localized_time"].apply(f)

所以这里f是一个将 localized_time元素映射到is_evening元素的函数。我们也可以使用lambda表达式,但这会更难看:

df["is_evening"] = df["localized_time"].\
    apply(lambda x: int(x.hour >= 17 and x.hour <= 3) if x != 'NA' else -1)