百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

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

toyiye 2024-08-16 05:12 12 浏览 0 评论

当我们自己学习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替换为未知、男性、女性

def transform(row):

"""
标识性别
"""

if row['gender'] == 1:

return ('男性')

elif row['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(lambda col: 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--

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码