有条件地将1或0设置为新的Pandas列

14

一个相当简单的pandas问题:

如果我有以下这样的数据框:

   hour
 0  0
 1  1
 2  1
 3  2
 4  2
  ...

我希望创建一个新的列'lunch',如果hour在11到1之间,则它将具有值1,否则为0。那么,最好且计算速度最快的方法是什么?


你说的 11 <= hour <= 1 是什么意思?这个条件永远不可能被满足,所以把所有东西都设为0就好了。 - Anand S Kumar
大概 @anand,hour 是在12小时制中的读数,所以它应该环绕。但是如果不能检查am/pm或日期,那么它将永远是真的。 - lvc
3个回答

16

你可以

In [231]: df['lunch'] = (df['hour']<=11) & (df['hour']<=1)

In [232]: df['lunch']
Out[232]:
0     True
1     True
2     True
3    False
4    False
Name: lunch, dtype: bool

In [233]: df['lunch'].astype(int)
Out[233]:
0    1
1    1
2    1
3    0
4    0
Name: lunch, dtype: int32

10

你可以采用向量化的方法(减法运算符在这里是用来取反布尔掩码的):

df['lunch'] = (-df.hour.isin(range(2,11))).astype(int)

Out[368]:
   hour  lunch
0     0      1
1     1      1
2     1      1
3     2      0
4     2      0

3

尝试:

>>> df['lunch']=df['hour'].apply(lambda x: 1 if x >= 11 or x <= 1 else 0)
>>> df
   hour  lunch
0     0      1
1     1      1
2     1      1
3     2      0
4     2      0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接