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在数据分析常用的使用方法都已经呈现给你了,相信你通过本次的学习,一定收获颇多。还是那句话,只有不断把所学知识运用到你的项目中,你才能真正的熟练使用它,感受它真正强大之处。
我是知道, 感谢各位人才的:点赞、收藏和评论,我们下期更精彩!





