Python Pandas:如果数据为NaN,则更改为0,否则在数据框中更改为1 [英] Python Pandas: if the data is NaN, then change to be 0, else change to be 1 in data frame

查看:672
本文介绍了Python Pandas:如果数据为NaN,则更改为0,否则在数据框中更改为1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个DataFrame:df,如下所示:

I have a DataFrame:df as following:

 row  id  name    age   url           
  1   e1   tom    NaN   http1   
  2   e2   john   25    NaN
  3   e3   lucy   NaN  http3 
  4   e4   tick   29    NaN

我想将NaN更改为0,否则将以下字段中的NaN更改为1:age,url. 我的代码正在执行,但这是错误的.

I want to change the NaN to be 0, else to be 1 in the columns: age, url. My code is following, but it is wrong.

  import Pandas as pd

  df[['age', 'url']].applymap(lambda x: 0 if x=='NaN' else x)

我想得到以下结果:

  row  id  name    age   url           
  1   e1   tom     0     1
  2   e2   john    1     0
  3   e3   lucy    0     1 
  4   e4   tick    1     0

感谢您的帮助!

推荐答案

您可以使用 isnull :

You can use where with fillna and condition by isnull:

df[['age', 'url']] = df[['age', 'url']].where(df[['age', 'url']].isnull(), 1)
                                       .fillna(0).astype(int)
print (df)

   row  id  name  age  url
0    1  e1   tom    0    1
1    2  e2  john    1    0
2    3  e3  lucy    0    1
3    4  e4  tick    1    0

numpy.where isnull :

df[['age', 'url']] = np.where(df[['age', 'url']].isnull(), 0, 1)
print (df)
   row  id  name  age  url
0    1  e1   tom    0    1
1    2  e2  john    1    0
2    3  e3  lucy    0    1
3    4  e4  tick    1    0

使用 notnull 的最快解决方案和 astype :

df[['age', 'url']] = df[['age', 'url']].notnull().astype(int)
print (df)
   row  id  name  age  url
0    1  e1   tom    0    1
1    2  e2  john    1    0
2    3  e3  lucy    0    1
3    4  e4  tick    1    0

我尝试修改您的解决方案:

I try modify your solution:

df[['age', 'url']] = df[['age', 'url']].applymap(lambda x: 0 if pd.isnull(x) else 1)
print (df)
   row  id  name  age  url
0    1  e1   tom    0    1
1    2  e2  john    1    0
2    3  e3  lucy    0    1
3    4  e4  tick    1    0

时间:

len(df)=4k:

In [127]: %timeit df[['age', 'url']] = df[['age', 'url']].applymap(lambda x: 0 if pd.isnull(x) else 1)
100 loops, best of 3: 11.2 ms per loop

In [128]: %timeit df[['age', 'url']] = np.where(df[['age', 'url']].isnull(), 0, 1)
100 loops, best of 3: 2.69 ms per loop

In [129]: %timeit df[['age', 'url']] = np.where(pd.notnull(df[['age', 'url']]), 1, 0)
100 loops, best of 3: 2.78 ms per loop

In [131]: %timeit df.loc[:, ['age', 'url']] = df[['age', 'url']].notnull() * 1
1000 loops, best of 3: 1.45 ms per loop

In [136]: %timeit df[['age', 'url']] = df[['age', 'url']].notnull().astype(int)
1000 loops, best of 3: 1.01 ms per loop

这篇关于Python Pandas:如果数据为NaN,则更改为0,否则在数据框中更改为1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆