在python中使用np.where函数时如何避免NaN?

时间:2019-09-16 19:30:32

标签: python pandas numpy dataframe nan

我有一个这样的数据框,

col1    col2   col3
1       apple   a,b 
2       car      c
3       dog     a,c
4       dog     NaN

我尝试创建三个新列abc,如果其中包含特定字符串,则将其设置为'1',否则为'0'。

df['a']= np.where(df['col3'].str.contains('a'),1,0)
df['b']= np.where(df['col3'].str.contains('b'),1,0)
df['c']= np.where(df['col3'].str.contains('c'),1,0)

但是,似乎NaN值未正确处理。它给我的结果是,

col1  col2  col3    a   b   c
1    apple   a,b    1   1   0
2     car     c     0   0   1
3     dog    a,c    1   0   1
4     dog    NaN    1   1   1

第4行中的全为0。如何更改代码以获得正确答案?

2 个答案:

答案 0 :(得分:4)

我会做什么

s=df.col2.str.get_dummies(sep=',')
Out[29]: 
   a  b  c
0  1  1  0
1  0  0  1
2  1  0  1
3  0  0  0
df=pd.concat([df,s],axis=1)

答案 1 :(得分:1)

您可以使用fillna(False)。 您正在使用布尔索引,因此与NaN对应的值始终为0

df['a']= np.where(df['col2'].str.contains('a').fillna(False),1,0)
df['b']= np.where(df['col2'].str.contains('b').fillna(False),1,0)
df['c']= np.where(df['col2'].str.contains('c').fillna(False),1,0)

输出:

   col1   col2 col3  a  b  c
0     1  apple  a,b  1  0  0
1     2    car    c  1  0  1
2     3    dog  a,c  0  0  0
3     4    dog  NaN  0  0  0