2017-08-17 17 views
2

我有一些數據,看起來像......我可以將Nans替換爲分組數據框中列的模式嗎?

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年謳歌TL。這可能看起來像

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

然後,我會歸咎於與基地楠(因爲基地是模式)。在這裏記住我很重要,我想爲每一個年份,製作和模型組做這件事。

回答

1

使用groupby然後mode工作。請注意0​​返回一個數組,並且您想要獲取它的第一個元素。 @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]) 
) 
+0

謝謝!不知道轉讓,看起來很方便 –

3

使用模式

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 
+0

直接覆蓋列中看到我的編輯,請。 –

相關問題