我有一些看起来像......的数据
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
有一些缺失值。我想做的是如下:
例如,我会看看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做这个。
使用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])
)
使用模式
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