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


Answers:


273

您可以直接使用DataFrame.fillnanan直接填充:

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()


10
df.fillna(df.mean())将返回新的数据帧,因此您必须编写df=df.fillna(df.mean())以保留它。
扬尼斯,

有什么想法为什么我可能会因为这个而被错误地估算为平均值?
bernando_vialli

25
代替df=df.fillna(df.mean())您的您还可以使用df.fillna(df.mean(), inplace=True)
安德森·皮门特尔

19
注意:如果要将其用于机器学习/数据科学:从数据科学的角度来看,先替换NA然后拆分为训练并测试是错误的 ...您必须首先分解为训练和测试,然后用替换NA意味着在火车上,然后应用此状态预处理模型进行测试,请参阅下面涉及sklearn的答案!
法比安·沃纳

1
@ amalik2205,因为否则您会将信息从测试集中泄漏到训练集中!想象一下:我们有100个数据行,并且考虑列x。x的前99个条目为NA。我们想将第100行拆分为测试集。假设第100行在x列中的值为20。然后,将x列中的训练集中的所有条目替换为20,该值来自测试集中的100%。因此,评估可能会欺骗您!
Fabian Werner


27
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

4
我不知道为什么,但是df.fillna(df.mean())没有用,只有您的版本适用。Python 3
Rocketq '17

12
# 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])

这一切比简单得多的替代方案有什么优势?
AMC

@Roshan Jha解释逻辑总是更好。在R&Python中有很多方法可以完成相同的任务。但是,如果您提出不同的建议,则可能需要指出一些这样做的优点
Nisha Arora博士

10

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

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

3
请提供一些有关如何解决问题的解释。
Gurwinder Singh

10

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

9

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

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

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


7

熊猫:如何用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


0

使用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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.