我知道我几乎就在那里,但无法找出相当于以下代码的更快的语法:
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
有人可以帮帮我吗?谢谢! :)
答案 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)