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

2024-10-06 04:21:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据看起来。。。在

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款讴歌TL,可能看起来像

^{pr2}$

然后,我用Base来填充Nan(因为Base是模式)。重要的是要记住,我要对每一组年份、品牌和型号都这样做。在


Tags: 数据basemakemodelyear年份品牌型号
2条回答

使用groupby,然后使用mode。注意,mode返回一个数组,您需要获取它的第一个元素。@约翰·高尔特值得称赞,我投了赞成票。在

我使用assign创建df的副本,其中包含{}列的覆盖版本。在

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

您可以直接用

^{pr2}$

使用模式

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来实际设置

^{pr2}$

如果你在小组工作

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

相关问题 更多 >