暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

我不允许你不知道,机器学习基础库pandas。

Python都知道 2022-09-01
244

0 前言

哈喽,大家好,我是知道。

我们在进行机器学习项目开发的过程中,数据的读取,清洗和转换是最开始的阶段,也是最耗时的。如果我们只用python的常用库来处理,那工作量是非常大的,不仅实现复杂还要考虑各种性能问题。而pandas作为数据分析领域最重要的库之一,它能通过简单的几行代码实现数据读取,清洗和转换的高效处理,并把处理后的结果很方便的可视化出来。本期课程按照数据加工的流程,把每个点最常用的使用方法介绍给你,让你通过本次课程的学习,能快速的把pandas运用到你工作中去。

1 关于pandas

Pandas 是python的核心数据分析库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。经过多年不懈的努力,Pandas 离这个目标已经越来越近了。

Pandas 适用于处理以下类型的数据:

  • 与 SQL 或 Excel 表类似的,含异构列的表格数据;
  • 有序和无序(非固定频率)的时间序列数据;
  • 带行列标签的矩阵数据,包括同构或异构型数据;
  • 任意其它形式的观测、统计数据集, 数据转入 Pandas 数据结构时不必事先标记。Pandas 的主要数据结构是 Series (一维数据)与 DataFrame (二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。对于 R 用户,DataFrame 提供了比 R 语言 data.frame 更丰富的功能。Pandas 基于 NumPy 开发,可以与其它第三方科学计算支持库完美集成。

pandas 相当于 python 中 excel:它使用表(也就是 dataframe),能在数据上做各种变换,但还有其他很多功能。

让我们开始吧:

import pandas as pd

为什么是「pd」而不是「p」,大家都这样用了,就成为习惯了。

2 数据读取

df = pd.read_csv( my_file.csv )
df = pd.read_csv( my_file.csv, sep=;, encoding=latin-1, nrows=1000, skiprows=[2,5])

read_csv强大之处在于它可以用一行代码支持读取本地文件或网络文件(url)。sep 代表的是分隔符。如果你在使用法语数据,excel 中 csv 分隔符是「;」,因此你需要显式地指定它。编码设置为 latin-1 来读取法语字符。nrows=1000 表示读取前 1000 行数据。skiprows=[2,5] 表示你在读取文件的时候会移除第 2 行和第 5 行。

  • 最常用的功能:read_csv, read_excel, read_json
  • 其他一些很棒的功能:read_clipboard, read_sql

3 数据结构

Pandas有两种最常用的数据结构:Series 和 Dataframe

3.1 Series

Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据即可产生最简单的Series:

data = np.array(['a', 'b', 'c', 'd'])
s=pd.Series(data)
s=pd.Series(data, index=[10, 11, 12, 13])
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s=pd.Series(data)
s = pd.Series(5, index=[0, 1, 2, 3])

Series可以通过narray,python字典,常量等创建对象,index 表示索引值,必须是惟一的,如果没有传递索引,则默认为 np.arrange(n)。

3.2 Dataframe

DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。

DataFrame 有两种创建方式,一种是通过pandas的IO操作(如:read_csv)生成DataFrame对象,另外一种方式就是通过pd.DataFrame()函数来创建,如:

data = [1,2,3,4,5]
df = pd.DataFrame(data)
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

通过例子我们看得出来,pd.DataFrame()函数通过传入多种python对象都能生成DataFrame对象,columns 表示列标签,如果没有传递 columns 值,则默认列标签是 np.arange(n)。index 表示行标签,如果没有传递 index 值,则默认行标签是 np.arange(n),n 代表 data 的元素个数。

4 数据访问

访问Series有三种常用的方式:

s[0] #位置下标
s['a'] #标签下标
s[:3] #切片

访问DataFrame常用的方式丰富很多:

df.head(3) #前三行
df.tail() #最后一行
df.loc['b'] #列标签
df.iloc[2] #列整数索引
df[2:4] #切片
df.loc[range(4,6)] #第四到第六行(左闭右开)的数据子集
data.loc[row_1, column_1 ] #取某行某列

#通过逻辑运算来取数据子集。
#要使用 & (AND)、 ~ (NOT) 和 | (OR),必须在逻辑运算前后加上「and」。
df[df[column_1]==french]
df[(df[column_1]==french)&(df[year_born]==1990)]
df[(df[column_1]==french)&(df[year_born]==1990)&~(df[city]==London)]

#除了可以在同一列使用多个OR,你还可以使用.isin()函数。
df[df[column_1].isin([french,english])]

5 数据处理

主要包含以下四类:

5.1 数据清洗

数据处理中的清洗工作主要包括对空值、重复值和异常值的处理:

5.1.1 空值
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f','h'],
columns=['one', 'two', 'three']) #创建了一个5行3列的二维表

#重建索引会产生有空值的3行数据
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
df['one'].isnull() #空为True, 不为空显示False
df['one'].notnull() #不为空显示True 空显示False
df['one'].sum() #求和计算,空值会设置为0
df.fillna(0) #填充空值
df.dropna() #删除空值,默认情况下,按照 axis=0 来按行处理,这意味着如果某一行中存在 NaN 值将会删除整行数据

5.1.2 重复值
#去重函数
df.drop_duplicates(subset=['A','B','C'],keep='first',inplace=True)
df.drop_duplicates() #默认保留第一次出现的重复项
df.drop_duplicates(keep=False) #删除所有重复项
df.drop_duplicates(subset=['B'],keep=False) #去除所有重复项,对于B列的重复项

参数说明如下:

  • subset:表示要进去重的列名,默认为 None。
  • keep:有三个可选参数,分别是 first、last、False,默认为 first,表示只保留第一次出现的重复项,删除其余重复项,last 表示只保留最后一次出现的重复项,False 则表示删除所有重复项。
  • inplace:布尔值参数,默认为 False 表示删除重复项后返回一个副本,若为 Ture 则表示直接在原数据上删除重复项。
5.1.3 异常值

判断异常值的标准依赖具体数据的分析,所以这里只给出常用的方法:

删除,drop,接受参数在特定轴线执行删除一条或多条记录,可通过axis参数设置是按行删除还是按列删除。

5.2 数值计算

由于pandas是在numpy的基础上实现的,所以numpy的常用数值计算操作在pandas中也适用:

df + 1  #加法
df * 2 #乘法
df ** 2 #平方

5.3 数据转换

df = pd.DataFrame({'one':[10,20,30,40,50,666], 'two':[99,0,30,40,50,60]})
#使用replace()方法
df.replace({99:10,666:60,0:20})

简单的数据转换用函数replace,对series或dataframe中每个元素执行按条件替换操作,还可开启正则表达式功能。

# map适用于series对象,可接受字典和函数参数
df['a'].map({0: 'zero', 6: 'six'})
df['b'].map(lambda x:x*3)

# apply既适用于series对象也适用于dataframe对象,仅姐受函数参数,且dataframe处理
# 是默认按行的粒度处理的。
df.apply(lambda x:x/np.max(x)) #各行归一化

# applymap仅适用于dataframe对象,且是对dataframe中的每个元素执行函数操作,
# 从这个角度讲,与replace类似,applymap可看作是dataframe对象的通函数。
df.applymap(lambda x:x**2) #对每个元素平方计算

除了replace函数,pandas还提供了更为强大的map, apply, applymap函数,例如:

5.4 合并与拼接

pd.merge(leftTable,rightTable,on='id')
pd.merge(leftTable,rightTable,on=['id','subject_id'])
pd.merge(leftTable,rightTable,on='subject_id',how="left")
pd.merge(leftTable,rightTable,on='subject_id',how="right")
pd.merge(leftTable,rightTable,on='subject_id',how="outer")

merge() 函数能够进行高效的合并操作,类似SQL中的join操作。leftTable,rightTable 表示两个dataFrame对象,how 表示要执行的合并(表关联)类型,从 {'left', 'right', 'outer', 'inner'} 中取值,默认为“inner”内连接。

pd.concat([a,b])
pd.concat([a,b], axis=1)

concat() 函数能够轻松地将 Series 与 DataFrame 对象组合在一起,  a, b 表示DataFrame 两个对象,axis 表示在哪个轴方向上(行或者列)进行连接操作,默认 axis=0 表示行方向。

a.append(b)
a.append(b, c, d)

append()函数类似python列表的append操作,可以支持多个Series 与 DataFrame 对象的拼接。

6 数据分析

6.1 基本统计量

df.describe()

展示数据的基本统计指标,包括计数、均值、方差、4分位数等,还可接收一个百分位参数列表展示更多信息

df[column_1].value_counts()

value_counts则仅适用于series,可以每个值出现的次数。

6.2 分组聚合

df.groupby(column_1)
df.groupby(column_1).groups
df.groupby([column_1,column_2]).groups
df.groupby(column_1).get_group(value_1)
grouped = df.groupby(column_1)
for label, option_course in grouped
df.groupby(column_1).agg(np.mean)
df.groupby(column_1).agg([np.size,np.mean,np.std])

使用 groupby() 函数,它和 SQL 的GROUP BY操作非常相似 。groups 表示分组列表;

get_group表示可以根据实际的值获取到对应的行数据;

groupby获取的对象也可以进行遍历;

groupby获取的对象的agg函数可以支持传入np的多种函数进行统计。

7 数据可视化

Pandas 之所以能够实现了数据可视化,主要利用了 Matplotlib 库的 plot() 方法,它对 plot() 方法做了简单的封装,因此您可以直接调用该接口。

df[column_1].plot() # 默认生成折线图

df[column_1].hist() #绘制直方图

8 数据保存

df.to_csv( my_new_file.csv , index=None)

index=None 表示将会以数据本来的样子写入。如果没有写 index=None,你会多出一个第一列,内容是 1,2,3,...,一直到最后一行。我通常不会去使用其他的函数,像.to_excel, .to_json, .to_pickle 等等,因为.to_csv 就能很好地完成工作,并且 csv 是最常用的表格保存方式。

9 推荐学习网站

《Pandas教程》(非常详细)

http://c.biancheng.net/pandas/

《Pandas Cookbook》中文翻译版:

https://www.jianshu.com/p/5809f6cf78ca

《pandas中文官网》

https://www.pypandas.cn/

10 总结

好了,pandas在数据分析常用的使用方法都已经呈现给你了,相信你通过本次的学习,一定收获颇多。还是那句话,只有不断把所学知识运用到你的项目中,你才能真正的熟练使用它,感受它真正强大之处。

我是知道, 感谢各位人才的:点赞、收藏和评论,我们下期更精彩!


文章转载自Python都知道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论