我有以下pandas数据帧:
A B
1 3
0 3
1 2
0 1
0 0
1 4
....
0 0
我想在右侧添加一个新列,遵循以下条件:
如果B
中的值3
或2
在1
中添加了new_col
,则
(*)
A B new_col
1 3 1
0 3 1
1 2 1
0 1 0
0 0 0
1 4 0
....
0 0 0
所以我尝试了以下内容:
df['new_col'] = np.where(df['B'] == 3 & 2,'1','0')
然而它没有奏效:
A B new_col
1 3 0
0 3 0
1 2 1
0 1 0
0 0 0
1 4 0
....
0 0 0
有关如何使用pandas和numpy(如(*)
进行多重连词声明的任何想法吗?
答案 0 :(得分:3)
您可以使用Pandas isin,它会返回一个布尔值,显示您要查找的元素是否包含在'B'
列中。
df['new_col'] = df['B'].isin([3, 2])
A B new_col
0 1 3 True
1 0 3 True
2 1 2 True
3 0 1 False
4 0 0 False
5 1 4 False
然后,您可以使用astype将boolean
值转换为0
和1
,将True
转换为1
和{{1}正在成为False
0
输出:
df['new_col'] = df['B'].isin([3, 2]).astype(int)
答案 1 :(得分:2)
df['new_col'] = [1 if x in [2, 3] else 0 for x in df.B]
运算符* + ^
按预期处理布尔值,并且用整数混合得到预期结果。所以你也可以这样做:
df['new_col'] = [(x in [2, 3]) * 1 for x in df.B]
答案 2 :(得分:1)
df=pd.DataFrame({'A':[1,0,1,0,0,1],'B':[3,3,2,1,0,4]})
print df
df['C']=[1 if vals==2 or vals==3 else 0 for vals in df['B'] ]
print df
A B
0 1 3
1 0 3
2 1 2
3 0 1
4 0 0
5 1 4
A B C
0 1 3 1
1 0 3 1
2 1 2 1
3 0 1 0
4 0 0 0
5 1 4 0
答案 3 :(得分:1)
使用numpy
:
>>> df['new_col'] = np.where(np.logical_or(df['B'] == 3, df['B'] == 2), '1','0')
>>> df
A B new_col
0 1 3 1
1 0 3 1
2 1 2 1
3 0 1 0
4 0 0 0
5 1 4 0
答案 4 :(得分:1)