当前位置:   article > 正文

数据分析——数据清洗之缺失值处理_df.isnull().sum()

df.isnull().sum()

在将数据进行分析或者跑机器学习算法时,缺失值处理是很重要的一步,下面将通过读取csv文件来举例说明。

读取csv文件时常见的缺失值有如下类型。

  • 空数据
  • 0
  • NA
  • 其他表示形式,如‘null’

一、空数据和NA数据以及其他表示空的数据

创建一个测试文件,从中可以看出,空数据或者是NA数据都会被默认为是NaN。并且在文件中只有是NA或者是空是才会被转换为NaN,而如果是null、None之类的则会被当作字符串处理。

 

  1. ID name gender age
  2. 0 1 NaN NaN 20.0
  3. 1 2 Zhang male 20.0
  4. 2 3 Wang female NaN
  5. 3 4 Liu male 20.0
  6. 4 5 Sun male 21.0

 既然都被转换为了NaN,那么就可以通过pandas.fillna()来将Nan替换为指定的值了。

  1. df = pd.read_csv('./data/for_test.csv')
  2. df['name'] = df['name'].fillna('WU')
  3. df['age'] = df['age'].fillna(df['age'].mean())
  4. df['gender'] = df['gender'].fillna('male')
  5. print(df)
  1. ID name gender age
  2. 0 1 WU male 20.00
  3. 1 2 Zhang male 20.00
  4. 2 3 Wang female 20.25
  5. 3 4 Liu male 20.00
  6. 4 5 Sun male 21.00

如果是null或者None之类的表示空的字符串可以先通过replace函数来处理,将这些空都统一为NaN。

df = df.replace('null', value=np.NaN)

二、如何在大规模数据中判断缺失值

通过一中的分析可以知道,无论是空还是Na形式的数据在DataFrame中都会转换为NaN数据类型。

下面通过Kaggle中House Price中的数据来进行举例说明如何在大规模数据中判断缺失值。

  1. df = pd.read_csv('./data/train.csv')
  2. miss_data_total = df.isnull().sum().sort_values(ascending=False)
  3. miss_data_per = (df.isnull().sum()/df.isnull().count()).sort_values(ascending=False)
  4. miss_data = pd.concat([miss_data_total, miss_data_per], axis=1, keys=['Total', 'Percentage'])
  5. print(miss_data.head(10))

首先,通过对总体数据进行isnull()判断,然后进行降序处理方便查看。其中,df.isnull().sum()作用就是将df.isnull()返回的True or False数组按照行相加,得到的就是null的个数,而df.isnull().count()则是统计整个True or False 数组的大小,如果这里用df.count()的话之会返回非null数据的个数统计。

  1. Total Percentage
  2. PoolQC 1453 0.995205
  3. MiscFeature 1406 0.963014
  4. Alley 1369 0.937671
  5. Fence 1179 0.807534
  6. FireplaceQu 690 0.472603
  7. LotFrontage 259 0.177397
  8. GarageCond 81 0.055479
  9. GarageType 81 0.055479
  10. GarageYrBlt 81 0.055479
  11. GarageFinish 81 0.055479

其中缺失值大于15%的数据列我们就可以考虑将其直接删掉了。

三、如何在大规模数据中处理缺失值

对于缺失值大于15%的数据我们可以直接删除了。

这里的df.drop()中的axis参数值有些让人不好理解,因为要删除整个column,所以应该是按列删除,所以axis应该是0,然而,这里的axis对应的不是整个dataframe,而是对应columns这块区域,将columns中的每个标签按照水平方向删除。

df = df.drop((miss_data[miss_data['Percentage'] > 0.15]).index, axis=1)

对于一些需要再考虑的数据列我们可以先打印出来,再进行选择如何补全数据。

  1. # check the missing data
  2. def cat_exploration(df, column):
  3. print(df[column].value_counts())
  4. # imput the missing data
  5. def cat_imputation(df, column, value):
  6. df.loc[df[column].isnull(), column] = value

还有些数据的缺失值通过实际情况判断,结果比较明显,那么就可以直接填充。

df.loc[df['Id'] == 580, 'BsmtCond'] = 'TA'

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/282688
推荐阅读
相关标签
  

闽ICP备14008679号