28

我有一个数据集,其中有一个名为“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()))

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

4

7 回答 7

54

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

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

或者你可以对分配做同样的事情:

data['Native Country'] = data['Native Country'].fillna(data['Native Country'].mode()[0])
于 2017-03-14T15:16:19.117 回答
7

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

于 2018-06-06T10:04:27.597 回答
2

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

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

但是,通过简单地取 Series 的第一个值fillna(df['colX'].mode()[0]),我认为我们可能会在数据中引入意外的偏差。如果样本是多峰的,那么只取第一个众数会使已经有偏差的插补方法变得更糟。例如,仅0当我们具有[0, 21, 99]同样最频繁的值时才采用。或者用给定列中同样频繁的False时间True和值填充缺失值。False

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

于 2020-02-04T20:24:33.907 回答
2
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]})
国家 已购买
0
1 法国 是的
2 是的
3 西班牙
4 法国
 df.fillna(df.mode())  ## only applied on first row because df.mode() returns a dataframe with one row
国家 已购买
0 法国 是的
1 法国 是的
2 是的
3 西班牙
4 法国
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
国家 已购买
0 法国 是的
1 法国 是的
2 法国 是的
3 西班牙
4 法国 是的
于 2021-01-19T16:18:20.677 回答
1

您可以获得数字“模式”或任何其他策略

  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)
于 2021-01-09T14:12:22.247 回答
0

尝试类似: fill_mode = lambda col: col.fillna(col.mode()) 和功能: new_df = df.apply(fill_mode, axis=0)

于 2020-09-28T23:24:52.830 回答
0

对于那些来到这里(就像我一样)在多列中填充 NA 的人,按多列分组并且遇到模式不返回任何内容的问题,其中组中只有 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 语句返回模式并返回组的 NA,其中只有 NA。

于 2021-03-08T12:44:40.343 回答