Python处理重复、缺失值
使用Python处理数据的重复、缺失值
1 导入模块
先导入一些常用的模块
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 魔法函数:内嵌绘图,不需要show()就可以显示图片
%matplotlib inline
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
2 数据加载
# 读取数据
data_raw=pd.read_excel('./data/crx_dataV1.xls')
# 保存
# data.to_excel('./data.xls',index=False)
3 查看数据的基本信息
# 查看数据基本信息
print('查看数据基本信息:')
print('shape:',data_raw.shape)
print('\n头部5行: \n\n',data_raw.head())
print('\n尾部5行: \n\n',data_raw.tail())
print('\n各个属性的摘要:\n',data_raw.describe())
# for col in data_raw.columns:
# print(col,' value_counts():')
# print(data_raw[col].value_counts())
# 统计某一列各种值的数量
# 以A1列为例
data_raw['A1'].value_counts()
value_counts()
也是可以用来查看重复行的
ref: (9个value_counts()的小技巧,提高Pandas 改进数据分析效率_deephub的博客-CSDN博客_value_count()
# 查看重复的行
data_raw.value_counts()
4 处理重复值
duplicatedFlag = data_raw.duplicated(keep=False) # 重复的行,均标记为True,例如,若行2,4,6是重复的,则全部标记为True
booleanIdx = duplicatedFlag.to_numpy()
print('\n去重之前,有重复的数据:\n',data_raw[booleanIdx])
data=data_raw.drop_duplicates() # 去除重复行
# 检查一下,看看是不是真的删掉了重复行
duplicatedFlag = data.duplicated(keep=False) # 重复的行,均标记为True,例如,若行2,4,6是重复的,则全部标记为True
booleanIdx = duplicatedFlag.to_numpy()
print('\n去重之后,无重复的数据:\n',data[booleanIdx])
5 处理缺失值
crx_dataV1.xls
中的缺失值是用?代替的,所以要先将?替换为NaN,然后再进行处理。
ref: Python Pandas DataFrame.isin()用法及代码示例 - 纯净天空 (vimsky.com)
# 数据中的缺失值用?表示,所以需要查找?
# 先用isin() 将?标记为True,其余标记为False
# 再用sum() 分别对每一列求和即可求出没一列中?的数量
miss_count=data.isin(['?']).sum()
miss_count
# 显然数据中是存在缺失值的(A1列有12个缺失值,A14列有13个缺失值)
显然数据中是有缺失值的。
# 以A1为例,输出A1中有缺失值的行
data[data['A1'].isin(['?'])]
ref:
pandas.DataFrame.replace — pandas 1.5.0 documentation (pydata.org)
# 将缺失值替换为pandas可以处理的值(np.nan)
data=data.replace("?",np.nan) # 将?替换为nan,
# 和上面的统计?数量类似
# 统计nan的数量
data.isnull().sum()
接下来将缺失值替换,有多种替换方式,可以直接删除、也可以用前一个值填充…
# data.dropna() # 删除有nan的行,inplace=True才会在原表上操作
data.fillna(method='ffill',inplace=True) # 用前一个值填充nan
数据、源码可以在github仓库获取:LZYLIAO/DATA_MINING (github.com)✨