大熊猫和numpy在条件/多个值的问题?

时间:2016-08-05 05:11:27

标签: python python-3.x pandas numpy scipy

我有以下pandas数据帧:

A  B
1  3
0  3
1  2
0  1
0  0
1  4
....
0  0

我想在右侧添加一个新列,遵循以下条件:

如果B中的值321中添加了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(如(*)进行多重连词声明的任何想法吗?

5 个答案:

答案 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

然后,您可以使用astypeboolean值转换为01,将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)

使用numpy

df['new'] = (df.B.values[:, None] == np.array([2, 3])).any(1) * 1

时序

超过给定的数据集

enter image description here

超过60,000行

enter image description here