告别数据挖掘苦活累活:python基于Pandas数据预处理最详细总结

当我们自己学习python进行数据分析实践的时候,对于采集的数据必须经过数据预处理才能进行分析和挖掘,往往这个过程是无趣的和繁杂的,需要耗费我们大量的时间,整体时间可能占比我们整体分析的60%以上,本次就对这部分知识进行全面梳理,让我们尽可能的告别数据挖掘的苦活累活,减少数据预处理的时间。

1、读取数据:excel和数据库读取

通常数据爬取的数据量小时存储在excel比较方便,如果爬取的数据量大会存储在数据库里面,因此常见读取是excel和数据库数据读取。

(1)excel读取

df= pd.read_excel('data.xlsx', header=None, names=['name','user_id','age','gender'], encoding='utf-8-sig', skipinitialspace=True)

标准的语法如下:

pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None,usecols=None, squeeze=False,dtype=None, engine=None,converters=None, true_values=None, false_values=None,skiprows=None, nrows=None, na_values=None, parse_dates=False,date_parser=None, thousands=None, comment=None, skipfooter=0,convert_float=True, **kwds)

如果想详细了解可以参考链接:https://blog.csdn.net/weixin_38546295/article/details/83537558

(2)数据库读取

数据库读取首先要连接数据库,然后读取数据库表格,最后转换成pandas的行列格式用于分析,代码如下:

db = pymysql.connect(host='localhost', user='root', passwd='密码', db='库名:Learn_data', port=3306, charset='utf8')cursor = db.cursor()cursor.execute("select * from table_info_fenxi")data=cursor.fetchall()df=pd.DataFrame(data,columns=['ID','排名','类型1','类型2'])

2、行列操作:单列、多列选择、创建新列、删除列

数据读取完就需要对行列进行操作,可以是单列,也可以是多列进行选择,在选中列的基础上进行分析。

(1)选择单列

可以直接按照列名称选择如下:

print(df['age'])print(df.age)

也可以通过ix、iloc、loc方法进行选择行列。

Ix方法可以使用数值或者字符作为索引来选择行列

Iloc方法只能使用数值作为索引来选择行列

Loc方法只能使用字符索引来选择行列

print(df.ix[:, 'age'])print(df.loc[:, 'age'])print(df.iloc[:, 2:3])

(2)选择多列

选择多列和选择单列一样,不同之处是使用ix和loc方法的时候,行索引是前后都包括,而列索引是前包后不包,iloc方法是行列都是前包后不包

# 行索引前后都包,列索引前包后包print(df.ix[0:5, 0:5])print(df.loc[0:5, ('name','user_id','age','gender','city')])# 行列索引前包后不包print(df.iloc[0:5, 0:5])

(3)创建新列

创建新列一般是通过直接赋值完成

df['new_line'] = df['old_line']

(4)删除列

删除列使用方法drop,可以删除单列也可以多列同时删除

# 删除单列print(df.drop('single', axis=1))# 删除多列print(df.drop(['singleA','singleB'], axis=1))

3、条件查询

(1)单条件查询

条件查询使用常见的比较运算符进行查询,如「==、>、<、>=、<=、!=」。查询结果可以是bool索引,也可以是原数据

# 生成bool索引print(df.age > 17)# 返回符合条件的数据print(df[df.age > 17])

(2)多条件查询

多条件查询就是组合查询的条件,添加多个运算符。如「&、~、|」,分别代表与、或、非。

# 筛选且条件print(df[(df.age > 17) & (df.gender == 2)])# 筛选非条件print(df[~(df.age == 0)])# 筛选或条件print(df[(df.city == 500) | (df.city == 400)])

pandas还提供了更方便的条件查询方法,比如:query、between、isin、str.contains(匹配开头)。

#query查询# 筛选年龄print(df.query('age > 17'))# 筛选或条件print(df.query('(city == 500) | (city == 400)'))#between查询,查询范围内部记录# 查询18到25岁的用户数据,inclusive为True意思是将边界包括在内print(df[df['age'].between(18,25, inclusive=True)])#isin方法查询# 查询在某个时间评论的用户情况print(df[df['date'].isin(['2021-03-11 16:19:00','2021-03-11 16:00:00'])])

4、数据连接:横向、众向连接

(1)横向连接

pandas通常通过merge方法来进行横向连接,其中包括内连接、外连接。

内连接会根据公共字段保留两表共有的信息。

# 公共字段名称一致时print(df1.merge(df2, how='inner', on='user_id'))# 公共字段名称不一致时print(df1.merge(df2, how='inner', left_on='user1_id', right_on='user2_id'))

外连接包括左连接、右连接、全连接

哪边连接哪边的信息就会全部保留下来,另一边的缺失信息会以NaN进行补全。

# 公共字段名称一致时print(df1.merge(df2, how='left', on='user_id'))print(df1.merge(df2, how='right', on='user_id'))print(df1.merge(df2, how='outer', on='user_id'))

(2)纵向连接

众向合并是将多张表众向拼接成一张表。众向常用concat方法进行合并,concat不仅仅可以众向也可以横向合并。参数axis值为0代表众向,为1代表横向。

# ignore_index=True表示忽略两表原先的行索引,合并并重新排序索引,drop_duplicates()表示去重print(pd.concat([df1, df2], ignore_index=True, axis=0).drop_duplicates())

9、排序

常见的排序有以下三种:sort_values、sort_index、sortlevel

sort_values:按照值顺序排序

sort_index:按照索引排序

sortlevel:按照级别排序

代码举例如下:sort_index和sortlevel类似

# 按用户年龄降序排序,last表示缺失值数据排在最后面(first)print(df.sort_values('age', ascending=False, na_position='last'))# 多个排序变量,这里以性别和年龄(有先后顺序)print(df.sort_values(['gender','age'], ascending=False, na_position='last'))

10、分组汇总

分组方法使用groupby方法进行分组汇总。Agg也可以用来汇总,用于一次汇总多个统计量。

# 对性别分组,汇总点赞数,获取点赞数最大值print(df.groupby('gender')[['praise']].max())# 对性别和年龄分组,获取点赞数的平均值print(df.groupby(['gender','age'])[['praise']].mean())# 对性别分组,获取点赞数和年龄的平均值print(df.groupby(['gender'])[['praise','age']].mean())# 对性别分组,获取性别的计数值print(df.groupby(['gender'])[['gender']].count())# 多重索引print(df.groupby(['gender','date'])['age','praise'].agg(['mean','max','min','count']))

11、赋值与条件赋值

(1)某一个值替换

# 将某个值替换print(df.praise.replace(33,np.nan))

(2)条件赋值

通过函数方法,比如将0,1,2替换为未知、男性、女性

deftransform(row):"""标识性别"""ifrow['gender'] ==1:return('男性')elifrow['gender'] ==2:return('女性')else:return('未知')# axis=1为列循环,axis=0为行循环print(df.apply(transform, axis=1))# 赋值到新列print(df.assign(gender_c=df.apply(transform, axis=1)))

通过条件查询方法直接赋值

df = df.copy()df.loc[df.gender ==0,'gender_c'] ='未知'df.loc[df.gender ==1,'gender_c'] ='男性'df.loc[df.gender ==2,'gender_c'] ='女性'print(df)

12、重复值处理

针对数据清洗过程中会查看重复数据和删除重复数据,或者删除固定ID重复的ID数据,代码如下:

# 查看重复的数据print(df[df.duplicated()])# 删除重复的数据print(df.drop_duplicates())# 去除用户ID重复的所有记录print(df.drop_duplicates('user_id'))

13、缺失值处理

数据预处理到后续会针对缺失值进行查看,了解缺失比例好考虑是删除还是补充缺失值,因此,缺失情况代码如下:

# sum(col.isnull())表示当前列有多少缺失,col.size表示当前列总共有多少行数据print(df.apply(lambdacol: sum(col.isnull())/col.size))

缺失值填补如下:

# 填补缺失值print(df.name.fillna('未知'))

还可以使用isnull来表示缺失值,然后通过0、1类型来指示变量

# 默认的bool类型print(df.name.isnull())# 数值0、1型指示变量print(df.name.isnull().apply(int))

14、数据分箱

在特征训练前需要对数据进行分箱、分箱主要有两种形式,一种是等宽、一种是等深分箱。

等宽:每个分箱的取值范围一致

# 等宽分箱print(pd.cut(df.age, 5))# 自定义标签print(pd.cut(df.age, bins=5, labels=[10, 15, 20, 25, 30]))

等深:每个分箱样本数量一致

# 去除没有年龄数据的用户df = df[df.age !=0]# 输出等深度分2箱的分位数print(df.age.quantile([0,0.5,1]))# include_lowest=True表示包含边界的最小值print(pd.cut(df.age, bins=df.age.quantile([0,0.5,1]), include_lowest=True))

以上就是数据挖掘过程中最常用的数据预处理方法,可能在数据预处理过程中要反复的使用上述方法对数据进行前期处理,如果熟练此方法会大大提高数据挖掘效率。

当然pandas的高效方法还有很多,以上基本可以满足日常使用,如还需更复杂的处理可以进一步探索总结。

--END--

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容