pandas DataFrame:用列的平均值替换nan值

时间:2013-09-08 23:54:05

标签: python pandas nan

我的pandas DataFrame主要填充了实数,但其中也有一些nan值。

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

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

12 个答案:

答案 0 :(得分:185)

您只需使用DataFrame.fillna直接填充nan

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

fillna的文档字符串表示value应该是标量或字典,但它似乎也适用于Series。如果您想传递词典,可以使用df.mean().to_dict()

答案 1 :(得分:32)

尝试:

sub2['income'].fillna((sub2['income'].mean()), inplace=True)

答案 2 :(得分:20)

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

答案 3 :(得分:9)

    for i in range(0, np.size(time)):
        if height[i]=0
            del time[i]
            del height[i]

答案 4 :(得分:8)

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

sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))

答案 5 :(得分:6)

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

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

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

答案 6 :(得分:4)

直接使用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')

答案 7 :(得分:3)

尽管下面的代码可以完成这项工作,但是当您处理一个记录数为100k或更多的DataFrame时,其性能会受到很大的影响:

df.fillna(df.mean())

根据我的经验,应该替换NaN值(用Mean或Median代替),仅在需要时替换,而不要在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万条记录的数据框

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

道歉!希望这会有所帮助!

答案 8 :(得分:2)

Pandas:如何用一栏的平均值(均值),中位数或其他统计值替换NaN(nan)值

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

如果您要替换NaN df['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

答案 9 :(得分: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.nan变为NaN

答案 10 :(得分:0)

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

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

df = df.apply(fill_mean, axis = 0)

答案 11 :(得分:0)

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

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

Here 是 value_counts api 引用。