我有一个熊猫DataFrame填充大部分实数,但有一些nan值在它以及。
我怎么能把这些nan替换成它们所在列的平均值呢?
这个问题与下面这个问题非常相似:numpy array:用列的平均值替换nan值,但不幸的是,这里给出的解决方案不适用于pandas DataFrame。
我有一个熊猫DataFrame填充大部分实数,但有一些nan值在它以及。
我怎么能把这些nan替换成它们所在列的平均值呢?
这个问题与下面这个问题非常相似:numpy array:用列的平均值替换nan值,但不幸的是,这里给出的解决方案不适用于pandas DataFrame。
当前回答
Pandas:如何将NaN (NaN)值替换为一列的平均值(平均值)、中位数或其他统计数据
假设你的DataFrame是df,你有一列叫做nr_items。这是:df['nr_items']
如果你想用列的平均值替换你的列df['nr_items']的NaN值:
使用方法.fillna():
mean_value = df [' nr_items '] .mean () df [' nr_item_ave '] = df (' nr_items '] .fillna (mean_value)
我已经创建了一个名为nr_item_ave的新df列来存储新列,其中NaN值被该列的平均值替换。
你在使用平均数时要小心。如果你有异常值,更推荐使用中位数
其他回答
# 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])
除此之外,还有一种选择:
df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))
它没有之前的mean响应那么优雅,但如果您希望用其他列函数替换null,那么它可以更短。
您还可以使用value_counts来获取最频繁的值。这适用于不同的数据类型。
df = df.apply(lambda x:x.fillna(x.value_counts().index[0]))
下面是value_counts api引用。
如果你想用均值来替换缺失的值你想一列一列地替换,那么这个只会替换那一列的均值。这可能更容易读。
sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))
虽然,下面的代码可以完成工作,但它的性能会受到很大的影响,因为你处理一个#记录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中的#记录
DataFrame与~100k记录
代码1:22.06秒 代码2:0.03秒
DataFrame有~200k条记录
代码1:180.06秒 代码2:0.06秒
DataFrame有大约160万条记录
代码1:代码不停地运行 代码2:0.40秒
DataFrame有大约1300万条记录
代码1:——甚至没有尝试,在看到1.6 Mn记录的性能之后—— 代码2:3.20秒
很抱歉回答这么长!希望这能有所帮助!