259

我有一个大部分填充实数的 pandas DataFrame,但其中也有一些nan值。

如何nan用它们所在的列的平均值替换 s?

这个问题与这个问题非常相似:numpy array: replace nan values with average of columns 但不幸的是,那里给出的解决方案不适用于 pandas DataFrame。

4

12 回答 12

370

您可以简单地使用直接DataFrame.fillna填充nan's:

In [27]: df 
Out[27]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3       NaN -2.027325  1.533582
4       NaN       NaN  0.461821
5 -0.788073       NaN       NaN
6 -0.916080 -0.612343       NaN
7 -0.887858  1.033826       NaN
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

In [28]: df.mean()
Out[28]: 
A   -0.151121
B   -0.231291
C   -0.530307
dtype: float64

In [29]: df.fillna(df.mean())
Out[29]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.151121 -2.027325  1.533582
4 -0.151121 -0.231291  0.461821
5 -0.788073 -0.231291 -0.530307
6 -0.916080 -0.612343 -0.530307
7 -0.887858  1.033826 -0.530307
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

的文档字符串fillnavalue应该是标量或字典,但是,它似乎也可以与 a 一起使用Series。如果你想传递一个 dict,你可以使用df.mean().to_dict().

于 2013-09-09T05:27:50.430 回答
84

尝试:

sub2['income'].fillna((sub2['income'].mean()), inplace=True)
于 2015-10-16T20:18:30.597 回答
38
In [16]: df = DataFrame(np.random.randn(10,3))

In [17]: df.iloc[3:5,0] = np.nan

In [18]: df.iloc[4:6,1] = np.nan

In [19]: df.iloc[5:8,2] = np.nan

In [20]: df
Out[20]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3       NaN -0.985188 -0.324136
4       NaN       NaN  0.238512
5  0.769657       NaN       NaN
6  0.141951  0.326064       NaN
7 -1.694475 -0.523440       NaN
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

In [22]: df.mean()
Out[22]: 
0   -0.251534
1   -0.040622
2   -0.841219
dtype: float64

应用每列的平均值并填充

In [23]: df.apply(lambda x: x.fillna(x.mean()),axis=0)
Out[23]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3 -0.251534 -0.985188 -0.324136
4 -0.251534 -0.040622  0.238512
5  0.769657 -0.040622 -0.841219
6  0.141951  0.326064 -0.841219
7 -1.694475 -0.523440 -0.841219
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794
于 2013-09-09T00:15:05.900 回答
21

虽然,下面的代码完成了这项工作,但是它的性能受到了很大的影响,因为你处理一个带有 # 记录 100k 或更多的 DataFrame:

df.fillna(df.mean())

根据我的经验,应该只在需要的地方替换 NaN 值(无论是平均值还是中值),而不是在整个 DataFrame 中应用 fillna()

我有一个包含 20 个变量的 DataFrame,其中只有 4 个需要 NaN 值处理(替换)。我尝试了上面的代码(代码 1),以及它的稍微修改的版本(代码 2),在那里我有选择地运行它。即仅在具有 NaN 值的变量上运行

#------------------------------------------------
#----(Code 1) Treatment on overall DataFrame-----

df.fillna(df.mean())

#------------------------------------------------
#----(Code 2) Selective Treatment----------------

for i in df.columns[df.isnull().any(axis=0)]:     #---Applying Only on variables with NaN values
    df[i].fillna(df[i].mean(),inplace=True)

#---df.isnull().any(axis=0) gives True/False flag (Boolean value series), 
#---which when applied on df.columns[], helps identify variables with NaN values

下面是我观察到的性能,因为我不断增加 DataFrame 中的 # 记录

具有约 10 万条记录的 DataFrame

  • 代码 1:22.06 秒
  • 代码 2:0.03 秒

具有约 20 万条记录的 DataFrame

  • 代码 1:180.06 秒
  • 代码 2:0.06 秒

具有约 160 万条记录的 DataFrame

  • 代码 1:代码不停地运行
  • 代码 2:0.40 秒

具有约 1300 万条记录的 DataFrame

  • 代码 1:——在看到 160 万条记录的性能后,甚至没有尝试——
  • 代码 2:3.20 秒

抱歉,答案很长!希望这可以帮助 !

于 2020-07-29T17:08:59.683 回答
15
# To read data from csv file
Dataset = pd.read_csv('Data.csv')

X = Dataset.iloc[:, :-1].values

# To calculate mean use imputer class
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])
于 2017-07-10T18:54:20.213 回答
14

如果您想用平均值估算缺失值并且您想逐列进行,那么这只会用该列的平均值进行估算。这可能更具可读性。

sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))
于 2017-02-26T03:15:59.660 回答
12

直接用df.fillna(df.mean())均值填充所有空值

如果你想用该列的平均值填充空值,那么你可以使用它

假设x=df['Item_Weight']这里Item_Weight是列名

在这里我们分配(用 x 的平均值填充 x 的空值到 x 中)

df['Item_Weight'] = df['Item_Weight'].fillna((df['Item_Weight'].mean()))

如果你想用一些字符串填充空值然后使用

Outlet_size是列名

df.Outlet_Size = df.Outlet_Size.fillna('Missing')
于 2018-06-27T22:19:16.353 回答
10

除了上述之外,另一个选择是:

df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))

它不如以前的均值响应优雅,但如果您希望用其他列函数替换空值,它可能会更短。

于 2016-11-15T19:40:34.960 回答
9

Pandas:如何将 NaN ( nan) 值替换为一列的平均值 (mean)、中位数或其他统计数据

假设您的 DataFrame 是df,并且您有一列名为nr_items. 这是: df['nr_items']

如果您想用列的平均值替换列的值:NaNdf['nr_items']

使用方法.fillna()

mean_value=df['nr_items'].mean()
df['nr_item_ave']=df['nr_items'].fillna(mean_value)

我创建了一个df名为nr_item_ave存储新列的新列,其中的NaN值替换为mean列的值。

使用时应该小心mean。如果你有异常值更推荐使用median

于 2019-02-04T14:02:11.870 回答
2

使用 sklearn 库预处理类

from sklearn.impute import SimpleImputer
missingvalues = SimpleImputer(missing_values = np.nan, strategy = 'mean', axis = 0)
missingvalues = missingvalues.fit(x[:,1:3])
x[:,1:3] = missingvalues.transform(x[:,1:3])

注意:在最近的版本中参数missing_values值更改为np.nanfromNaN

于 2020-03-12T03:58:56.457 回答
1

我使用此方法通过列的平均值填充缺失值。

fill_mean = lambda col : col.fillna(col.mean())

df = df.apply(fill_mean, axis = 0)
于 2021-05-25T09:28:50.437 回答
0

您还可以使用value_counts来获取最频繁的值。这将适用于不同的数据类型。

df = df.apply(lambda x:x.fillna(x.value_counts().index[0]))

是 value_counts api 参考。

于 2021-07-07T09:41:24.463 回答