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)