龙空技术网

python数据分析:缺失值插补实例操练

Codewar 442

前言:

现在咱们对“csv导入数据库中数据有缺失”大致比较注重,看官们都需要学习一些“csv导入数据库中数据有缺失”的相关内容。那么小编同时在网摘上收集了一些关于“csv导入数据库中数据有缺失””的相关资讯,希望看官们能喜欢,我们快快来了解一下吧!

今天的文章给大家写写如何进行数值型缺失值和分类型缺失值的插补。废话不多写,直接上例子(数据链接发不了,请关注后私信回复“数据链接”获取本头条号所有使用数据)

首先导入和查看数据及缺失情况,代码如下

import pandas as pddf=pd.read_csv('dataset/winemag-data-130k-v2.csv')df.info()

得到数据信息如下图:

可以看到数据库非常庞大,有12万多条输入,其中不乏缺失值,现在就带领大家一步一步来处理。

第一步查看具体缺失情况

df.isnull().sum()

得到输出如下图:

使用均值插补数值型缺失

可以看到只有四列数据没有缺失值,其余列都存在,我们先来解决一个简单的,先来插补price,最简单就是直接用整列的均值插补,代码如下:

df['price'].fillna(df['price'].mean(), inplace = True)df.isnull().sum()

上面代码在插补后再次打印缺失数据统计信息

可以看到此时price列缺失数据已经为0了,但是你想过没有对于这么庞大的一个来自多个国家的12万多条数据,只简单的用均值插补好不好?

当然不好

比较好一点的方法是每个国家的price的缺失用该国家的均值插补,我带着大家先来做个简单的:我们先写出美国price的缺失,用美国的均值插补的代码,如下:

df_US = df[df['country']=='US']df_US.isnull().sum()df_US['price'].fillna(df_US['price'].mean(), inplace = True)df_US.isnull().sum()

以上代码首先取出国家这个变量是美国的数据,并命名为df_US,然后查看美国数据的缺失分布,然后用美国的price均值对缺失进行了插补,最后再次查看缺失。

这个就是对单个国家的price的插补处理,现在我们得考虑如何写一个for循环,遍历所有国家数据,插补完成后形成一个新的完整数据集。代码如下:

frame=[]for i in list(set(df['country'])):    df_country=df[df['country']==i]    df_country['price'].fillna(df_country['price'].mean(),inplace = True)    frame.append(df_country)    final_df = pd.concat(frame)final_df.isnull().sum()

解释一下以上代码:首先建立列表用来储存分开的每个国家的数据框,然后循环每一个国家的数据进行均值插补(注意此处集合的运用,可以去除国家中的重复),每个国家均值插补完成后就append到frame中,最后再将整个frame合并成新的完整数据,再看缺失值统计,输出如下:

此时可以看到,price依然有一个缺失值,什么问题呢?我们看看每个国家的数据量,看看能不能发现问题

from collections import CounterCounter(df['country'])

看我们的输出

这只是部分输出,可以看到Egypt,China,Slovakia都只有一行值,会不会是刚好这一行price缺失了呢?我们不妨看一看

果然,我们发现Egypt的price为缺失值,说明确实是我们想的这个问题,就是某个国家只有一行数据,刚好price就缺失了,现在我们的解决方法是在for循环中加上一个条件判断,代码变为

frames = []for i in list(set(df['country'])):    df_country = df[df['country']== i]    if len(df_country) > 1:            df_country['price'].fillna(df_country['price'].mean(),inplace = True)            else:        df_country['price'].fillna(df['price'].mean(),inplace = True)    frames.append(df_country)        final_df = pd.concat(frames)final_df.isnull().sum()

运行代码得到结果:

可以看到price的缺失果然全部被插补好了。

再推广一步,我们能不能写一个插补缺失的方程

我们一直追求代码复用嘛,不能每次遇到一个新的类似数据库就重写一个代码,这样不符合编程思想,下面我们就来写一个插补数值型缺失值的函数,代码如下:

def impute_numerical(categorical_column, numerical_column):    frames = []    for i in list(set(df[categorical_column])):        df_category = df[df[categorical_column]== i]        if len(df_category) > 1:                df_category[numerical_column].fillna(df_category[numerical_column].mean(),inplace = True)                else:            df_category[numerical_column].fillna(df[numerical_column].mean(),inplace = True)        frames.append(df_category)            final_df = pd.concat(frames)    return final_df

讲一讲上面的代码,首先定义一个函数叫做impute_numerical,也就是插补数值型缺失,这个函数有2个参数,一个是分类变量的变量名,一个是要插补的数值型变量,然后其余的思路还是和上面的按国家插补price一样,首先建立一个list储存按分类变量拆分后的数据框,然后在每个数据框中实行均值插补,然后合并插补后的数据框为final_df最终数据框。

大概就是这么个思路,我们看一看上面的函数在我们这个数据中运行的结果

impute_price  = impute_numerical('country', 'price')impute_price.isnull().sum()

可以看到,对于我们这个有12万数据的数据库,通过一个函数,price的缺失值一下就全部插补好了。相应的我们可以写出分类变量缺失的插补函数

def impute_categorical(categorical_column1, categorical_column2):    cat_frames = []    for i in list(set(df[categorical_column1])):        df_category = df[df[categorical_column1]== i]        if len(df_category) > 1:                df_category[categorical_column2].fillna(df_category[categorical_column2].mode()[0],inplace = True)                else:            df_category[categorical_column2].fillna(df[categorical_column2].mode()[0],inplace = True)        cat_frames.append(df_category)            cat_df = pd.concat(cat_frames)    return cat_df

讲解一下,上面的函数用的是分类变量中每个类的众数对该类的缺失值进行了插补,思路和数值型变量的思路一样,我们还是在我们的数据集上运行一下分类变量的插补函数

impute_taster = impute_categorical('country', 'taster_name')impute_taster.isnull().sum()

这而我还是按照country来插补taster_name这个分类变量

可以看到运行函数后taster_name这一变量得到了完美插补。

总结

这篇文章给大家介绍了如何在python中对缺失值的插补方法,首先,我写了如何用全列的均值对该列的数值型缺失进行插补,然后又进一步带领大家用每一类的均值插补该类的缺失,这样插补的数据更加稳定实用。更重要的是带领大家编写了2个函数,分别用来自动插补数据库中的数值型缺失和分类型缺失,并且这两个函数都在提供的数据集中得到了很好的运行。(数据链接发不了,请关注后私信回复“数据链接”获取本头条号所有使用数据)。

最后,感谢大家耐心看完。发表这些东西的主要目的就是督促自己,希望大家关注评论指出不足,一起进步。内容我都会写的很细,用到的数据集也会在原文中给出链接,你只要按照文章中的代码自己也可以做出一样的结果,一个目的就是零基础也能懂,因为自己就是什么基础没有从零学Python的,加油。

往期精彩:python数据分析:用python在地图上标出纽约枪击案

python应用实战:给图片添加文本

标签: #csv导入数据库中数据有缺失