【问题标题】:Can I replace Nans with the mode of a column in a grouped data frame?我可以用分组数据框中的列模式替换 Nans 吗?
【发布时间】:2018-01-26 06:26:31
【问题描述】:

我有一些数据看起来像......

Year      Make   Model  Trim
2007     Acura  TL      Base
2010     Dodge  Avenger SXT
2009     Dodge  Caliber SXT
2008     Dodge  Caliber SXT
2008     Dodge  Avenger SXT

Trim 有一些缺失值。我想做的是如下所示:

  • 按年份和型号分组
  • 如果该组缺少 valyes,则推算 Trim

例如,我会查看所有 2007 Acura TL。可能看起来像

 Year      Make   Model Trim
2007     Acura  TL      Base
2007     Acura  TL      XLR
2007     Acura  TL      NaN
2007     Acura  TL      Base

然后,我会将 Nan 归入 Base(因为 Base 是 Mode)。重要的是要记住,我想对每一组年份、品牌和型号都执行此操作。

【问题讨论】:

    标签: python pandas missing-data imputation


    【解决方案1】:

    使用模式

    In [215]: df
    Out[215]:
       Year   Make    Model  Trim
    0  2007  Acura       TL  Base
    1  2010  Dodge  Avenger   SXT
    2  2009  Dodge  Caliber   NaN
    3  2008  Dodge  Caliber   SXT
    4  2008  Dodge  Avenger   SXT
    
    In [216]: df.Trim.fillna(df.Trim.mode()[0])
    Out[216]:
    0    Base
    1     SXT
    2     SXT
    3     SXT
    4     SXT
    Name: Trim, dtype: object
    

    使用inplace=True实际设置

    In [217]: df.Trim.fillna(df.Trim.mode()[0], inplace=True)
    
    In [218]: df
    Out[218]:
       Year   Make    Model  Trim
    0  2007  Acura       TL  Base
    1  2010  Dodge  Avenger   SXT
    2  2009  Dodge  Caliber   SXT
    3  2008  Dodge  Caliber   SXT
    4  2008  Dodge  Avenger   SXT
    

    如果您在小组中工作

    In [227]: df
    Out[227]:
       Year   Make Model  Trim
    0  2007  Acura    TL  Base
    1  2007  Acura    TL   XLR
    2  2007  Acura    TL   NaN
    3  2007  Acura    TL  Base
    
    In [228]: (df.groupby(['Year', 'Make', 'Model'])['Trim']
                 .apply(lambda x: x.fillna(x.mode()[0])))
         ...:
    Out[228]:
    0    Base
    1     XLR
    2    Base
    3    Base
    Name: Trim, dtype: object
    

    【讨论】:

      【解决方案2】:

      使用groupby,然后使用mode。请注意,mode 返回一个数组,您想要获取它的第一个元素。 @John Galt 值得称赞并得到我的支持。

      我使用assign 来创建df 的副本,其中覆盖了Trim 列。

      df.assign(
          Trim=df.groupby(
              ['Year', 'Make', 'Model']
          ).Trim.apply(
              lambda x: x.fillna(x.mode()[0])
          )
      )
      
         Year   Make Model  Trim
      0  2007  Acura    TL  Base
      1  2007  Acura    TL   XLR
      2  2007  Acura    TL  Base
      3  2007  Acura    TL  Base
      

      你可以直接覆盖列

      df['Trim'] = df.groupby(
          ['Year', 'Make', 'Model']
      ).Trim.apply(
          lambda x: x.fillna(x.mode()[0])
      )
      

      【讨论】:

      • 谢谢!不知道assign,看起来很方便
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 2020-05-29
      • 2020-05-01
      • 1970-01-01
      相关资源
      最近更新 更多