如何Pandas fillna() with mode of column?

How to Pandas fillna() with mode of column?

我有一个数据集,其中有一个名为 'Native Country' 的列,其中包含大约 30000 条记录。有些缺失由 NaN 表示,所以我想用 mode() 值填充它。我写了这样的东西:

data['Native Country'].fillna(data['Native Country'].mode(), inplace=True)

然而,当我计算缺失值时:

for col_name in data.columns: 
    print ("column:",col_name,".Missing:",sum(data[col_name].isnull()))

它仍然为 Native Country 列提供相同数量的 NaN 值。

只需调用系列的第一个元素:

data['Native Country'].fillna(data['Native Country'].mode()[0], inplace=True)

或者您可以对赋值做同样的事情:

data['Native Country'] = data['Native Country'].fillna(data['Native Country'].mode()[0])

请注意,NaN 可能是您的数据帧的模式:在这种情况下,您要将 NaN 替换为另一个 NaN。

如果我们用fillna(df['colX'].mode())填充缺失值,由于mode()的结果是一个系列,它只会填充匹配索引的前几行。至少如果按以下方式完成:

fill_mode = lambda col: col.fillna(col.mode())
df.apply(fill_mode, axis=0)

但是,通过简单地获取系列的第一个值 fillna(df['colX'].mode()[0]),我认为我们冒着在数据中引入意外偏差的风险。如果样本是多峰的,只取第一个众数会使已经有偏差的插补方法变得更糟。例如,如果我们将 [0, 21, 99] 作为同样最频繁的值,则只取 0。或者当 TrueFalse 值在给定列中出现的频率相同时,用 False 填充缺失值。

我这里没有明确的解决方案。如果必须使用该模式,则从所有局部最大值分配一个随机值可能是一种方法。

尝试这样的事情: fill_mode = lambda col: col.fillna(col.mode()) 和功能: new_df = df.apply(fill_mode, axis=0)

你可以得到号码'mode'或任何其他策略

  1. 模式:
    num = data['Native Country'].mode()[0]
    data['Native Country'].fillna(num, inplace=True)
  1. 对于平均值,中位数:
    num = data['Native Country'].mean() #or median(); No need of [0] because it returns a float value.
    data['Native Country'].fillna(num, inplace=True)

或者像这样在一行中

data['Native Country'].fillna(data['Native Country'].mode()[0], inplace=True)
import numpy as np

import pandas as pd

print(pd.__version__)

1.2.0

df = pd.DataFrame({'Country': [np.nan, 'France', np.nan, 'Spain', 'France'], 'Purchased': [np.nan,'Yes', 'Yes', 'No', np.nan]})
Country Purchased
0 NaN NaN
1 France Yes
2 NaN Yes
3 Spain No
4 France NaN
 df.fillna(df.mode())  ## only applied on first row because df.mode() returns a dataframe with one row
Country Purchased
0 France Yes
1 France Yes
2 NaN Yes
3 Spain No
4 France NaN
df = pd.DataFrame({'Country': [np.nan, 'France', np.nan, 'Spain', 'France'], 'Purchased': [np.nan,'Yes', 'Yes', 'No', np.nan]})

df.fillna(df.mode().iloc[0]) ## convert df to a series
Country Purchased
0 France Yes
1 France Yes
2 France Yes
3 Spain No
4 France Yes

对于那些来这里(像我一样)在多列中填充 NA 的人,按多列分组并且遇到模式 returns nothing 的问题,组中只有 NA 值:

df[['col_to_fill_NA_1','col_to_fill_NA_2']] = df.groupby(['col_to_group_by_1', 'col_to_group_by_2'], dropna=False)[['col_to_fill_NA_1','col_to_fill_NA_2']].transform(lambda x: x.fillna(x.mode()[0]) if len(x.mode()) == 1 else x)

您可以填写任意数量的“col_to_fill_NA”并按任意数量的“col_to_group_by”进行分组。 if 语句 returns mode if mode exists and returns NAs for the groups, where there only NAs.