我可以用分组数据框中的列模式替换Nans吗?

时间:2017-08-17 17:47:30

标签: python pandas missing-data imputation

我有一些看似......的数据。

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,则进行修剪

例如,我会看看2007 Acura TL的所有内容。这可能看起来像

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

然后,我会用Base来归纳Nan(因为Base是模式)。重要的是要记住,我想为每一组Year,Make和Model做这个。

2 个答案:

答案 0 :(得分:3)

使用模式

puts "Type ADD 'name' to add a name, DEL 'name' to delete, and EXIT to end program."

parser = CommandParser.new

while (parser.parse(gets.chomp))
  puts "Names: #{NameRegistry.names.join(', ')}"
end

使用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

答案 1 :(得分:1)

使用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])
)