【问题标题】:Python Pandas: if the data is NaN, then change to be 0, else change to be 1 in data framePython Pandas:如果数据为NaN,则更改为0,否则在数据框中更改为1
【发布时间】:2016-12-01 03:14:11
【问题描述】:

我有一个 DataFrame:df 如下:

 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,否则为 1:年龄、url。 我的代码如下,但它是错误的。

  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

感谢您的帮助!

【问题讨论】:

    标签: pandas dataframe python-3.5


    【解决方案1】:

    您可以使用wherefillnaisnull 条件:

    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.whereisnull

    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
    

    notnullastype 的最快解决方案:

    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
    

    编辑:

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

    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
    

    【讨论】:

    • 感谢您的友好回答。我明天会根据投票接受它。
    • 你帮了我很大的忙。其实数据框是一个大数据框,速度对我来说很重要!
    • 那么piRSquared 解决方案是最快的。
    • 我找到了更快的解决方案piRSquared,请查看最后的编辑。
    • 你是最热情和最善良的,有时不仅仅是基于最佳答案。现在,我接受你!祝你好运!
    【解决方案2】:

    使用np.wherepd.notnull 分别用01 替换缺失和有效的元素:

    In [90]:
    df[['age', 'url']] = np.where(pd.notnull(df[['age', 'url']]), 1, 0)
    df
    
    Out[90]:
       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
    

    【讨论】:

      【解决方案3】:
      df.loc[:, ['age', 'url']] = df[['age', 'url']].notnull() * 1
      df
      

      【讨论】:

        猜你喜欢
        • 2021-06-19
        • 1970-01-01
        • 2020-10-22
        • 2020-12-04
        • 1970-01-01
        • 1970-01-01
        • 2018-05-22
        • 2017-08-22
        • 1970-01-01
        相关资源
        最近更新 更多