【问题标题】:Filling NAN data with mode() doesn't work -Pandas用 mode() 填充 NAN 数据不起作用 -Pandas
【发布时间】:2016-11-08 11:31:01
【问题描述】:

我有一个数据集,其中有一个称为 Outlet_Size 的系列,其中包含 {'Medium', nan, 'High', 'Small'} 中的任何一个,大约 2566 条记录丢失,所以我想用 mode() 值填充它,所以我写了这样的内容:

  train['Outlet_Size']=train['Outlet_Size'].fillna(train['Outlet_Size'].dropna().mode()]

但是当我试图通过命令查找缺失的 NaN 记录数时

  sum(train['Outlet_Size'].isnull()) 

它仍然显示 2566 条 NaN 记录。为什么会这样?

感谢您的回答

【问题讨论】:

    标签: python pandas machine-learning nan


    【解决方案1】:

    这里的问题是mode 返回一个系列,这导致fillna 失败,如果我们看一个简单的例子:

    In [194]:    
    df = pd.DataFrame({'a':['low','low',np.NaN,'medium','medium','medium','medium']})
    df
    
    Out[194]:
            a
    0     low
    1     low
    2     NaN
    3  medium
    4  medium
    5  medium
    6  medium
    
    In [195]:    
    df['a'].fillna(df['a'].mode())
    
    Out[195]:
    0       low
    1       low
    2       NaN
    3    medium
    4    medium
    5    medium
    6    medium
    Name: a, dtype: object
    

    如果我们查看mode 返回的内容,您可以在上面看到它失败了:

    In [196]:    
    df['a'].mode()
    
    Out[196]:
    0    medium
    dtype: object
    

    虽然只有一行,但它是一个系列,因此当您将其传递给 fillna 时,它只会填充第一行,因此您想要通过索引 Series 来获取标量值:

    In [197]:    
    df['a'].fillna(df['a'].mode()[0])
    
    Out[197]:
    0       low
    1       low
    2    medium
    3    medium
    4    medium
    5    medium
    6    medium
    Name: a, dtype: object
    

    编辑

    关于dropna是不是必须的,不是:

    In [204]:
    df = pd.DataFrame({'a':['low','low',np.NaN,'medium','medium','medium','medium',np.NaN,np.NaN,np.NaN,np.NaN]})
    df['a'].mode()
    
    Out[204]:
    0    medium
    dtype: object
    

    可以看到NaN被忽略了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-21
      • 2017-03-11
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 2021-12-14
      相关资源
      最近更新 更多