![](/img/trans.png)
[英]I cannot get Fillna in Python to Work when using Mode to Replace NaNs with Most Frequent Column String Value
[英]Can I replace Nans with the mode of a column in a grouped data frame?
我有一些看起來像...的數據
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是Mode)。 重要的是要記住,我要對Year,Make和Model的每個組執行此操作。
使用方式
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
使用groupby
then mode
。 請注意, mode
返回一個數組,您想獲取它的第一個元素。 @John Galt為此值得贊揚,得到我的支持。
我使用assign
創建具有覆蓋的Trim
列版本的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
您可以直接使用覆蓋該列
df['Trim'] = df.groupby(
['Year', 'Make', 'Model']
).Trim.apply(
lambda x: x.fillna(x.mode()[0])
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.