8.2.3、Python__pandas库对数据简单的清洗,清洗缺失值,替换,删除等操作

python核心用法–常用数据分析库(上)

1、准备工作

import pandas as pd						#导入库
data = pd.read_csv("data/movie_metadata.csv")	#导入数据

2、检查数据

data.head()	#查看数据前5行

3、处理缺失数据

(1)数据缺失的原因:
从来没有填正确过,数据不可用,计算错误
(2)处理方式
为缺失数据赋值默认值,去掉/删除缺失数据行,去掉/删除缺失率高的列
1)添加默认值----fillna()

data.isnull()	#查看是否是空值(缺失)

使用空字符串来填充country字段的空值
    data.country= data.country.fillna('')	#fillna填充
使用均值来填充电影时长字段的空值
    data.duration = data["duration"].fillna(data.duration.mean())

2)删除不完整的行----dropna()

data.loc[5039].isnull().value_counts()	#统计这一行的 空值的个数	.sum也行
data.dropna()	#一行只有一个空值就删除
data.dropna(how="all")	#都为空值才会删除
data.dropna(thresh=24)	#设置一个非空定值超过则删除
data.dropna(axis=1)	#处理列方向参数axis=1,

3)规范化数据类型

data.title_year = data.title_year.fillna(0)	#先处理缺失值
data.title_year = data.title_year.astype(int)	#改为int类型
data.info()					#查看

4)必要的变换—错别字,空格等

data.loc[4,"color"] = "Color"	#找到列更改
data.movie_title.str.upper()	#将某列数据改为大写,针对字符串操作,str
data['movie_title'].str.strip()	#取出两边空格

5)重命名列名----rename

data.rename(columns={
    
    "title_year":"年份"},inplace=True)

4、保存结果----以csv格式保存

#参数:index去索引,header去表头,encoding编码格式
data.to_csv("./data/new_movie_clear_data.csv",index=None,header=None,encoding='UTF8')

python核心用法–常用数据分析库(下)

1、准备数据

import pandas as pd	
df = pd.read_csv('data/patient_heart_rate.csv')	#导入数据
df.head()						#查看数据

在这里插入图片描述

2、清洗数据

(1)没有列头

 column_names= ['id', 'name', 'age', 'weight','m0006',
                'm0612','m1218','f0006','f0612','f1218']
df = pd.read_csv('data/patient_heart_rate.csv', names = column_names)

(2)一个列有多个参数

 ----将name列切分为first_name和last_name两列
df[['first_name','last_name']] = df.name.str.split(" ",expand=True)	#将name切分,expand变成两列,赋给df
df.drop("name",axis=1,inplace =True)					#在原来的 name列

(3)列数据的单位不统一

lbs_weight = df[df.weight.str.contains('lbs').fillna(False)]['weight']	#空值使用False替换,取出lbs单位的数据,在取出weight列

def lbs_to_kgs(lbs):		#传入参数weight列数据
    kgs = float(lbs[:-3])/2.2	#将weight列数据取出,后面单位不要,str转成float类型,进行kgs单位换算
    return kgs			#返回换算好的数据weight
    
lbs_weight.apply(lbs_to_kgs)	#使用apply方法,传入一个函数(函数式变成,数据一个个的传入函数)
#可以使用匿名函数
#lbs_weight = lbs_weight.apply(lambda lbs: "%.2fkgs" %(float(lbs[:-3])/2.2))

df.loc[lbs_weight.index,'weight'] = lbs_weight	#将转好的数据赋回去,相应索引的数据和weight列

(4)缺失值

删:删除数据缺失的记录 
赝品:使用合法的初始值替换,数值类型可以使用 	0,字符串可以使用空字符串“” 
均值:使用当前列的均值 
高频:使用当前列出现频率最高的数据 
源头优化:如果能够和数据收集团队进行沟通,就共同排查问题,寻找解决方案。

(5)重复数据----drop_duplicates删除

df.drop_duplicates("weight")	#后面相同的 数据会被删除

(6)非 ASCII 字符
在数据集中 Fristname 和 Lastname 有一些非 ASCII 的字符。
处理非 ASCII 数据方式有多种

删除
替换
仅仅提示一下

df['first_name'].replace({
    
    r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({
    
    r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df.head()

(7)有些列头应该是数据,而不应该是列名参数
-----就是将一行分成多行

sorted_columns = ['id','age','weight','first_name','last_name']
df = pd.melt(df,				#df名
             id_vars=sorted_columns,	#不需要改变的列
             var_name='sex_hour',		#列名
             value_name='puls_rate').sort_values(sorted_columns)
df[df.puls_rate!='-'].dropna().sort_values('id').reset_index()	#去空,排序,重置索引

df[['sex','hour']] = df['sex_hour'].apply(lambda x:pd.Series(([x[:1],'{}-{}'.format(x[1:3],x[3:])])))[[0,1]]
df.drop('sex_hour', axis=1, inplace=True)
row_with_dashes = df['puls_rate'].str.contains('-').fillna(False)
df.drop(df[row_with_dashes].index,inplace=True)
df = df.reset_index(drop=True)
print(df)

猜你喜欢

转载自blog.csdn.net/nerer/article/details/121193391