Pandas
Pandas是Python这门编程语言中一个专门用来做数据分析的工具;它能很方便的处理这种tabular data也即表列数据的包,如果你的数据可以放进内存,能够做的相对不那么大的话,pandas可能就是你的首选,如果你的数据集特别大,几百G或者更大,那么
你可能得选用其他的框架,来加快速度(如果数据特别大的话,可以考虑dask,它实现了pandas的大部分功能,但是多了对于分布式和大规模数据的支持);但是对于pandas来说,即便数据特别大,你也可以通过采样把它变得相对来说比较小。
SVG文件相对来说画起来分辨率高一些;不然matplotlib相对来说画出来的分辨率比较低。
Pandas是使用Python语言开发的用于数据处理和数据分析的第三方库。它擅长处理数字型数据和时间序列数据,当然文本型的数据也能轻松处理。
作为Python的三方库,Pandas是建构在Python的基础上的,它封装了一些复杂的代码实现过程,我们只要调用它的方法就能轻松实现我们的需求。
Python中的库、框架、包意义基本相同,都是别人造好的轮子,我们可以直接使用,以减少重复的逻辑代码。正是由于有众多覆盖各个领域的框架,我们使用起Python来才能简单高效,而不用关注技术实现细节。
Pandas由Wes McKinney于2008年开发。McKinney当时在纽约的一家金融服务机构工作,金融数据分析需要一个健壮和超快速的数据分析工具,于是他就开发出了Pandas。
Pandas的命名跟熊猫无关,而是来自计量经济学中的术语“面板数据”(Panel data)。面板数据是一种数据集的结构类型,具有横截面和时间序列两个维度。不过,我们不必了解它,它只是一种灵感、思想来源。
Pandas对数据的处理是为数据分析服务的,它所提供的各种数据处理方法、工具是基于数理统计学的,包含了日常应用中的众多数据分析方法。我们学习它不仅要掌控它的相应技术,还要从它的数据处理思路中学习数据分析的理论和方法。
特别地,如果你想要成为数据分析师、数据产品经理、数据开发工程师等与数据相关的工作者,学习Pandas能让你深入数据理论和实践,更好地理解和应用数据。
Pandas可以轻松应对白领们日常工作中的各种表格数据处理需求,还应用在金融、统计、数理研究、物理计算、社会科学、工程等领域。
Pandas可以实现复杂的处理逻辑,这些往往是Excel等工具无法完成的,还可以自动化、批量化,免去我们在处理相同的大量数据时的重复工作。
Pandas可以实现非常震撼的可视化效果,它对接众多令人赏心悦目的可视化库,可以实现动态数据交互效果。
Pandas的基本功能
Pandas常用的基本功能如下:
从Excel、CSV、网页、SQL、剪贴板等文件或工具中读取数据;合并多个文件或者电子表格中的数据,将数据拆分为独立文件;数据清洗,如去重、处理缺失值、填充默认值、补全格式、处理极端值等;建立高效的索引;支持大体量数据;按一定业务逻辑插入计算后的列、删除列;灵活方便的数据查询、筛选;分组聚合数据,可独立指定分组后的各字段计算方式;数据的转置,如行转列、列转行变更处理;连接数据库,直接用SQL查询数据并进行处理;对时序数据进行分组采样,如按季、按月、按工作小时,也可以自定义周期,如工作日;窗口计算,移动窗口统计、日期移动等;灵活的可视化图表输出,支持所有的统计图形;为数据表格增加展示样式,提高数据识别效率。
04
Pandas快速入门
1、安装导入
首先安装pandas库。打开“终端”并执行以下命令:
pip install pandas matplotlib# 如网络慢,可指定国内源快速下载安装pip install pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
安装完成后,在终端中启动Jupyter Notebook,给文件命名,如pandas-01。在Jupyter Notebook中导入Pandas,按惯例起别名pd:
# 引入 Pandas库,按惯例起别名pd, import pandas as pd
这样,我们就可以使用pd调用Pandas的所有功能了。
2、准备数据集
数据集(Data set或dataset),又称为资料集、数据集合或资料集合,是一种由数据组成的集合,可以简单理解成一个Excel表格。在分析处理数据时,我们要先了解数据集。对所持有数据各字段业务意义的理解是分析数据的前提。
介绍下我们后面会经常用的数据集team.xlsx,可以从网址 https://www.gairuo.com/file/data/dataset/team.xlsx下载。它的内容见表1。
表1 team.xlsx的部分内容
这是一个学生各季度成绩总表(节选),各列说明如下。
name:学生的姓名,这列没有重复值,一个学生一行,即一条数据,共100条。team:所在的团队、班级,这个数据会重复。Q1~Q4:各个季度的成绩,可能会有重复值。
3、读取数据
了解了数据集的意义后,我们将数据读取到Pandas里,变量名用df(DataFrame的缩写,后续会介绍),它是Pandas二维数据的基础结构。
import pandas as pd # 引入Pandas库,按惯例起别名pd# 以下两种效果一样,
如果是网址,它会自动将数据下载到内存df = pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx')
df = pd.read_excel('team.xlsx') # 文件在notebook文件同一目录下#
如果是CSV,使用pd.read_csv(),还支持很多类型的数据读取
这样就把数据读取到变量df中,输入df看一下内容,在Jupyter Notebook中的执行效果如图2所示。
图2 读取数据的执行效果
其中:
自动增加了第一列,是Pandas为数据增加的索引,从0开始,程序不知道我们真正的业务索引,往往需要后面重新指定,使它有一定的业务意义;由于数据量大,自动隐藏了中间部分,只显示前后5条;底部显示了行数和列数。
4、查看数据
读取完数据后我们来查看一下数据:
df.head() # 查看前5条,括号里可以写明你想看的条数
df.tail() # 查看尾部5条df.sample(5) # 随机查看5条
查看前5条时的结果如图3所示。
图3
5、验证数据
拿到数据,我们还需要验证一下数据是否加载正确,数据大小是否正常。下面是一些常用的代码,可以执行看看效果(一次执行一行):
df.shape # (100, 6) 查看行数和列数
df.info() # 查看索引、数据类型和内存信息
df.describe() # 查看数值型列的汇总统计
df.dtypes # 查看各字段类型
df.axes # 显示数据行和列名
df.columns # 列名
df.info()显示有数据类型、索引情况、行列数、各字段数据类型、内存占用等:
df.describe()会计算出各数字字段的总数(count)、平均数(mean)、标准差(std)、最小值(min)、四分位数和最大值(max):
6、建立索引
以上数据真正业务意义上的索引是name列,所以我们需要使它成为索引:
df.set_index('name', inplace=True) # 建立索引并生效
其中可选参数inplace=True会将指定好索引的数据再赋值给df使索引生效,否则索引不会生效。注意,这里并没有修改原Excel,从我们读取数据后就已经和它没有关系了,我们处理的是内存中的df变量。
将name建立索引后,就没有从0开始的数字索引了,如图4所示。
图4 将name设置为索引的执行效果
7、数据选取
接下来,我们像Excel那样,对数据做一些筛选操作。
(1)选择列
选择列的方法如下:
# 查看指定列df['Q1']df.Q1 # 同上,如果列名符合Python变量名要求,可使用
显示如下内容:
df.Q1Out:0 891 362 573 934 65 ..95 4896 2197 9898 1199 21Name: Q1, Length: 100, dtype: int64
这里返回的是一个Series类型数据,可以理解为数列,它也是带索引的。之前建立的索引在这里发挥出了作用,否则我们的索引是一个数字,无法知道与之对应的是谁的数据。
选择多列的可以用以下方法:
# 选择多列df[['team', 'Q1']] # 只看这两列,注意括号df.loc[:, ['team', 'Q1']] # 和上一行效果一样
df.loc[x, y]是一个非常强大的数据选择函数,其中x代表行,y代表列,行和列都支持条件表达式,也支持类似列表那样的切片(如果要用自然索引,需要用df.iloc[])。下面的例子中会进行演示。
(2)选择行
选择行的方法如下:
# 用指定索引选取df[df.index == 'Liver'] # 指定姓名# 用自然索引选择,类似列表的切片
df[0:3] # 取前三行df[0:10:2] # 在前10个中每两个取一个
df.iloc[:10,:] # 前10个
图4 将name设置为索引的执行效果
7、数据选取
接下来,我们像Excel那样,对数据做一些筛选操作。
(1)选择列
选择列的方法如下:
# 查看指定列df['Q1']df.Q1 # 同上,如果列名符合Python变量名要求,可使用
显示如下内容:
df.Q1Out:0 891 362 573 934 65 ..95 4896 2197 9898 1199 21Name: Q1, Length: 100, dtype: int64
这里返回的是一个Series类型数据,可以理解为数列,它也是带索引的。之前建立的索引在这里发挥出了作用,否则我们的索引是一个数字,无法知道与之对应的是谁的数据。
选择多列的可以用以下方法:
# 选择多列df[['team', 'Q1']] # 只看这两列,注意括号
df.loc[:, ['team', 'Q1']] # 和上一行效果一样
df.loc[x, y]是一个非常强大的数据选择函数,其中x代表行,y代表列,行和列都支持条件表达式,也支持类似列表那样的切片(如果要用自然索引,需要用df.iloc[])。下面的例子中会进行演示。
(2)选择行
选择行的方法如下:
# 用指定索引选取
df[df.index == 'Liver'] # 指定姓名# 用自然索引选择,类似列表的切片
df[0:3] # 取前三行
df[0:10:2] # 在前10个中每两个取一个
df.iloc[:10,:] # 前10个
(3)指定行和列
同时给定行和列的显示范围:
df.loc['Ben', 'Q1':'Q4'] # 只看Ben的四个季度成绩
df.loc['Eorge':'Alexander', 'team':'Q4'] # 指定行区间
(4)条件选择
按一定的条件显示数据:
# 单一条件df[df.Q1 > 90] # Q1列大于90的
df[df.team == 'C'] # team列为'C'的
df[df.index == 'Oscar'] # 指定索引即原数据中的name# 组合条件
df[(df['Q1'] > 90) & (df['team'] == 'C')] # and关系
df[df['team'] == 'C'].loc[df.Q1>90] # 多重筛选
8、排序
Pandas的排序非常方便,示例如下:
df.sort_values(by='Q1') # 按Q1列数据升序排列
df.sort_values(by='Q1', ascending=False) # 降序
df.sort_values(['team', 'Q1'], ascending=[True, False]) # team升序,Q1降序
9、分组聚合
我们可以实现类似SQL的groupby那样的数据透视功能:
df.groupby('team').sum() # 按团队分组对应列相加
df.groupby('team').mean() # 按团队分组对应列求平均# 不同列不同的计算方法
df.groupby('team').agg({'Q1': sum, # 总和'Q2': 'count', # 总数'Q3':'mean', # 平均'Q4': max}) # 最大值
统一聚合执行后的效果如图5所示。
图6 分组后每列用不同的方法聚合计算
10、数据转换
对数据表进行转置,对类似图6中的数据以A-Q1、E-Q4两点连成的折线为轴对数据进行翻转,效果如图7所示,不过我们这里仅用sum聚合。
df.groupby('team').sum().T
图7 对聚合后的数据进行翻转
也可以试试以下代码,看有什么效果:
df.groupby('team').sum().stack()
df.groupby('team').sum().unstack()
11、增加列
用Pandas增加一列非常方便,就与新定义一个字典的键值一样。
df['one'] = 1# 增加一个固定值的列
df['total'] = df.Q1 + df.Q2 + df.Q3 + df.Q4 # 增加总成绩列# 将计算得来的结果赋值给新列
df['total'] = df.loc[:,'Q1':'Q4'].apply(lambda x:sum(x), axis=1
)df['total'] = df.sum(axis=1) # 可以把所有为数字的列相加
df['avg'] = df.total/4# 增加平均成绩列
12、统计分析
根据你的数据分析目标,试着使用以下函数,看看能得到什么结论。
df.mean() # 返回所有列的均值
df.mean(1) # 返回所有行的均值,下同
df.corr() # 返回列与列之间的相关系数
df.count() # 返回每一列中的非空值的个数
df.max() # 返回每一列的最大值
df.min() # 返回每一列的最小值
df.median() # 返回每一列的中位数
df.std() # 返回每一列的标准差
df.var() # 方差
s.mode() # 众数
13、绘图
Pandas利用plot()调用Matplotlib快速绘制出数据可视化图形。注意,第一次使用plot()时可能需要执行两次才能显示图形。如图8所示,可以使用plot()快速绘制折线图。
df['Q1'].plot() # Q1成绩的折线分布
图8 利用plot()快速绘制折线图
如图9所示,可以先选择要展示的数据,再绘图。
df.loc['Ben','Q1':'Q4'].plot() # ben四个季度的成绩变化
如图10所示,可以使用plot.bar绘制柱状图。
df.loc[ 'Ben','Q1':'Q4'].plot.bar() # 柱状图
df.loc[ 'Ben','Q1':'Q4'].plot.barh() # 横向柱状图
图10 利用plot.bar绘制的柱状图
如果想绘制横向柱状图,可以将bar更换为barh,如图11所示。
图11 利用barh绘制的横向柱状图
对数据聚合计算后,可以绘制成多条折线图,如图12所示。
# 各Team四个季度总成绩趋势df.groupby('team').sum().T.plot()
图12 多条折线图
也可以用pie绘制饼图,如图13所示。
# 各组人数对比df.groupby('team').count().Q1.plot.pie()
14、导出
可以非常轻松地导出Excel和CSV文件。
df.to_excel('team-done.xlsx') # 导出 Excel文件
df.to_csv('team-done.csv') # 导出 CSV文件
导出的文件位于notebook文件的同一目录下,打开看看。
pandas有两个主要数据结构:Series和DataFrame。
Series
Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成,即index和values两部分,可以通过索引的方式选取Series中的单个或一组值。
Series的创建
pd.Series(list,index=[ ]),第二个参数是Series中数据的索引,可以省略。
- 第一个参数可以是字典,字典的键将作为Series的索引
- 第一个参数可以是DataFrame中的某一行或某一列
Series类型的操作
Series类型索引、切片、运算的操作类似于ndarray,同样的类似Python字典类型的操作,包括保留字in操作、使用.get()方法。
Series和ndarray之间的主要区别在于Series之间的操作会根据索引自动对齐数据。
DataFrame
DataFrame是一个表格型的数据类型,每列值类型可以不同,是最常用的pandas对象。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。
DataFrame的创建
import pandas as pd data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002, 2003], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]} df= pd.DataFrame(data) In [45]: df Out[45]: pop state year 0 1.5 Ohio 2000 1 1.7 Ohio 2001 2 3.6 Ohio 2002 3 2.4 Nevada 2001 4 2.9 Nevada 2002 5 3.2 Nevada 2003
pd.DataFrame(data,columns = [ ],index = [ ]):columns和index为指定的列、行索引,并按照顺序排列。
- 创建DataFrame最常用的是直接传入一个由等长列表或NumPy数组组成的字典,会自动加上行索引,字典的键会被当做列索引:
In [48]: df2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], ....: index=['one', 'two', 'three', 'four', 'five', 'six']) In [49]: df2 Out[49]: year state pop debt one 2000 Ohio 1.5 NaN two 2001 Ohio 1.7 NaN three 2002 Ohio 3.6 NaN four 2001 Nevada 2.4 NaN five 2002 Nevada 2.9 NaN six 2003 Nevada 3.2 NaN
- 另一种常见的创建DataFrame方式是使用嵌套字典,如果嵌套字典传给DataFrame,pandas就会被解释为外层字典的键作为列,内层字典键则作为行索引:
In [65]: pop = {'Nevada': {2001: 2.4, 2002: 2.9}, ....: 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}} In [66]: df3 = pd.DataFrame(pop) In [67]: df3 Out[67]: Nevada Ohio 2000 NaN 1.5 2001 2.4 1.7 2002 2.9 3.6
DataFrame对象操作
- df.values:将DataFrame转换为ndarray二维数组,注意后面不加()。
- 通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series。
- 列可以通过赋值的方式进行修改。例如,我们可以给那个空的"debt"列赋上一个标量值或一组值。
- 将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值。
- 为不存在的列赋值会创建出一个新列。关键字del用于删除列。
import pandas as pd data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002, 2003], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]} In [48]: df2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], ....: index=['one', 'two', 'three', 'four', 'five', 'six']) In [50]: df2.columns Out[50]: Index(['year', 'state', 'pop', 'debt'], dtype='object') #通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series。 In [51]: df2['state'] #或者df2.state Out[51]: one Ohio two Ohio three Ohio four Nevada five Nevada six Nevada Name: state, dtype: object #列可以通过赋值的方式进行修改。例如,我们可以给那个空的"debt"列赋上一个标量值或一组值 In [54]: frame2['debt'] = 16.5 In [55]: frame2 Out[55]: year state pop debt one 2000 Ohio 1.5 16.5 two 2001 Ohio 1.7 16.5 three 2002 Ohio 3.6 16.5 four 2001 Nevada 2.4 16.5 five 2002 Nevada 2.9 16.5 six 2003 Nevada 3.2 16.5 #将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值 In [58]: val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five']) In [59]: df2['debt'] = val In [60]: df2 Out[60]: year state pop debt one 2000 Ohio 1.5 16.5 two 2001 Ohio 1.7 -1.2 three 2002 Ohio 3.6 16.5 four 2001 Nevada 2.4 -1.5 five 2002 Nevada 2.9 -1.7 six 2003 Nevada 3.2 16.5 #为不存在的列赋值,会创建出一个新列 In [61]: df2['eastern'] = df2.state == 'Ohio' In [62]: df2 Out[62]: year state pop debt eastern one 2000 Ohio 1.5 NaN True two 2001 Ohio 1.7 -1.2 True three 2002 Ohio 3.6 NaN True four 2001 Nevada 2.4 -1.5 False five 2002 Nevada 2.9 -1.7 False six 2003 Nevada 3.2 NaN False #关键字del用于删除列 In [63]: del df2['eastern'] In [64]: df2.columns Out[64]: Index(['year', 'state', 'pop', 'debt'], dtype='object')
pandas的基本功能
数据索引:Series和DataFrame的索引是Index类型,Index对象是不可修改,可通过索引值或索引标签获取目标数据,也可通过索引使序列或数据框的计算、操作实现自动化对齐。索引类型index的常用方法:
- .append(idx):连接另一个Index对象,产生新的Index对象
- .diff(idx):计算差集,产生新的Index对象
- .intersection(idx):计算交集
- .union(idx):计算并集
- .delete(loc):删除loc位置处的元素
-
.insert(loc,e):在loc位置增加一个元素
df.reindex(index, columns ,fill_value, method, limit, copy ):index/columns为新的行列自定义索引;
In [98]: frame = pd.DataFrame(np.arange(9).reshape((3, 3)), ....: index=['a', 'c', 'd'],columns=['Ohio', 'Texas', 'California']) In [99]: frame Out[99]: Ohio Texas California a 0 1 2 c 3 4 5 d 6 7 8 In [100]: frame2 = frame.reindex(['a', 'b', 'c', 'd']) In [101]: frame2 Out[101]: Ohio Texas California a 0.0 1.0 2.0 b NaN NaN NaN c 3.0 4.0 5.0 d 6.0 7.0 8.0
.drop():能够删除Series和DataFrame指定行或列索引。
删除一行或者一列时,用单引号指定索引,删除多行时用列表指定索引。
如果删除的是列索引,需要增加axis=1或axis='columns'作为参数。
增加inplace=True作为参数,可以就地修改对象,不会返回新的对象。
索引、选取和过滤
df.loc[行标签,列标签]:通过标签查询指定的数据,第一个值为行标签,第二值为列标签。当第二个参数为空时,查询的是单个或多个行的所有列。如果查询多个行、列的话,则两个参数用列表表示。
df.iloc[行位置,列位置]:通过默认生成的数字索引查询指定的数据。
In [128]: data = pd.DataFrame(np.arange(16).reshape((4, 4)), .....: index=['Ohio', 'Colorado', 'Utah', 'New York'], .....: columns=['one', 'two', 'three', 'four']) In [129]: data Out[129]: one two three four Ohio 0 1 2 3 Colorado 4 5 6 7 Utah 8 9 10 11 New York 12 13 14 15 #df.loc选取第二行、第二三列 In [137]: data.loc['Colorado', ['two', 'three']] Out[137]: two 5 three 6 Name: Colorado, dtype: int64 #df.iloc选取第二行、第二三列 In [138]: data.iloc[1, [1, 2]] Out[138]: two 5 three 6 Name: Colorado, dtype: int64
在pandas中,有多个方法可以选取和重新组合数据。对于DataFrame,表5-4进行了总结
排序 :在排序时,任何缺失值默认都会被放到末尾
.sort_index(axis=0, ascending=True):根据指定轴索引的值进行排序。默认轴axis=0, ascending=True,即默认根据0轴的索引值做升序排序。轴axis=1为根据1轴的索引值排序, ascending=False为降序。
在指定轴上根据数值进行排序,默认升序。
Series.sort_values(axis=0, ascending=True):只能根据0轴的值排序。
DataFrame.sort_values(by, axis=0, ascending=True),参数by为axis轴上的某个索引或索引列表。
pandas数据分析
统计分析、相关分析
适用于Series和DataFrame的基本统计分析函数:传入axis='columns'或axis=1将会按行进行运算。
.describe():针对各列的多个统计汇总,用统计学指标快速描述数据的概要。
.sum():计算各列数据的和
.count():非NaN值的数量
.mean( )/.median():计算数据的算术平均值、算术中位数
.var()/.std():计算数据的方差、标准差
.corr()/.cov():计算相关系数矩阵、协方差矩阵,是通过参数对计算出来的。Series的corr方法用于计算两个Series中重叠的、非NA的、按索引对齐的值的相关系数。DataFrame的corr和cov方法将以DataFrame的形式分别返回完整的相关系数或协方差矩阵。
.corrwith():利用DataFrame的corrwith方法,可以计算其列或行跟另一个Series或DataFrame之间的相关系数。传入一个Series将会返回一个相关系数值Series(针对各列进行计算),传入一个DataFrame则会计算按列名配对的相关系数。
.min()/.max():计算数据的最小值、最大值
.diff():计算一阶差分,对时间序列很有效
.mode():计算众数,返回频数最高的那(几)个
.mean():计算均值
.quantile():计算分位数(0到1)
.isin():用于判断矢量化集合的成员资格,可用于过滤Series中或DataFrame列中数据的子集
适用于Series的基本统计分析函数,DataFrame[列名]返回的是一个Series类型。
.unique():返回一个Series中的唯一值组成的数组。
.value_counts():计算一个Series中各值出现的频率。
.argmin()/.argmax():计算数据最大值、最小值所在位置的索引位置(自动索引)
.idxmin()/.idxmax():计算数据最大值、最小值所在位置的索引(自定义索引)
分组
- DataFrame.groupby():分组函数,使用方法参考https://blog.csdn.net/cymy001/article/details/78300900
-
pandas.cut():根据数据分析对象的特征,按照一定的数值指标,把数据分析对象划分为不同的区间部分来进行研究,以揭示其内在的联系和规律性。类似给成绩设定优良中差,比如:0-59分为差,60-70分为中,71-80分为优秀等等。使用方法参考
https://blog.csdn.net/weixin_39541558/article/details/80578529
https://blog.csdn.net/missyougoon/article/details/83986511
pandas读写文本格式的数据
pandas提供了一些用于将表格型数据读取为DataFrame对象的函数。下表对它们进行了总结,其中read_csv()、read_table()、to_csv()是用得最多的。
用pandas来进行数据清洗和准备
在数据分析和建模的过程中,相当多的时间要用在数据准备上:加载、清理、转换以及重塑。
处理缺失数据
在许多数据分析工作中,缺失数据是经常发生的。对于数值数据,pandas使用浮点值NaN(np.nan)表示缺失数据,也可将缺失值表示为NA(Python内置的None值)。
- .info():查看数据的信息,包括每个字段的名称、非空数量、字段的数据类型。
- .isnull():返回一个同样长度的值为布尔型的对象(Series或DataFrame),表示哪些值是缺失的,.notnull()为其否定形式。
import pandas as pd import numpy as np In [10]: string_data = pd.Series(['aardvark', 'artichoke', np.nan, None]) In [11]: string_data Out[11]: 0 aardvark 1 artichoke 2 NaN 3 None dtype: object In [14]: string_data.isnull() Out[14]: 0 False 1 False 2 True 3 True dtype: bool
import pandas as pd import numpy as np In [19]: data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3.]]) In [20]: data.dropna() Out[22]: 0 1 2 0 1.0 6.5 3.0 #传入how='all'将只丢弃全为NA的那些行: In [23]: data.dropna(how='all') Out[23]: 0 1 2 0 1.0 6.5 3.0 1 1.0 NaN NaN 3 NaN 6.5 3.0 In [24]: data[4] = NA In [25]: data Out[25]: 0 1 2 4 0 1.0 6.5 3.0 NaN 1 1.0 NaN NaN NaN 2 NaN NaN NaN NaN 3 NaN 6.5 3.0 NaN #用这种方式丢弃列,只需传入axis=1即可: In [26]: data.dropna(axis=1, how='all') Out[26]: 0 1 2 0 1.0 6.5 3.0 1 1.0 NaN NaN 2 NaN NaN NaN 3 NaN 6.5 3.0 #假设你只想留下一部分观测数据,可以用thresh参数实现此目的: In [27]: df = pd.DataFrame(np.random.randn(7, 3)) In [28]: df.iloc[:4, 1] = NA In [29]: df.iloc[:2, 2] = NA In [30]: df Out[30]: 0 1 2 0 -0.204708 NaN NaN 1 -0.555730 NaN NaN 2 0.092908 NaN 0.769023 3 1.246435 NaN -1.296221 4 0.274992 0.228913 1.352917 5 0.886429 -2.001637 -0.371843 6 1.669025 -0.438570 -0.539741 In [32]: df.dropna(thresh=2) Out[32]: 0 1 2 2 0.092908 NaN 0.769023 3 1.246435 NaN -1.296221 4 0.274992 0.228913 1.352917 5 0.886429 -2.001637 -0.371843 6 1.669025 -0.438570 -0.539741
- .fillna(value,method,limit,inplace):填充缺失值。value为用于填充的值(比如0、'a'等)或者是字典(比如{'列':1,'列':8,……}为指定列的缺失数据填充值);method默认值为ffill,向前填充,bfill为向后填充;limit为向前或者向后填充的最大填充量。inplace默认会返回新对象,修改为inplace=True可以对现有对象进行就地修改。
数据转换
替换值
.replace(old, new):用新的数据替换老的数据,如果希望一次性替换多个值,old和new可以是列表。默认会返回一个新的对象,传入inplace=True可以对现有对象进行就地修改。
删除重复数据
- .duplicated():判断各行是否是重复行(前面出现过的行),返回一个布尔型Series。
- .drop_duplicates():删除重复行,返回删除后的DataFrame对象。默认保留的是第一个出现的行,传入keep='last'作为参数后,则保留最后一个出现的行。
- 两者都默认会对全部列做判断,在传入列索引组成的列表[ '列1' , '列2' , ……]作为参数后,可以只对这些列进行重复项判断。
利用函数或字典进行数据转换
- Series.map():接受一个函数或字典作为参数。使用map方法是一种实现元素级转换以及其他数据清理工作的便捷方式。
import pandas as pd In [52]: data = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon','pastrami', 'corned beef', 'bacon','pastrami', 'honey ham', 'nova lox'], .... 'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]}) meat_to_animal = { 'bacon': 'pig', 'pulled pork': 'pig', 'pastrami': 'cow', 'corned beef': 'cow', 'honey ham': 'pig', 'nova lox': 'salmon' } #增加一列animal In [57]: data['animal'] = data['food'].map(meat_to_animal) In [58]: data Out[58]: food ounces animal 0 bacon 4.0 pig 1 pulled pork 3.0 pig 2 bacon 12.0 pig 3 Pastrami 6.0 cow 4 corned beef 7.5 cow 5 Bacon 8.0 pig 6 pastrami 3.0 cow 7 honey ham 5.0 pig 8 nova lox 6.0 salmon
DataFrame常见函数
df.head():查询数据的前五行
df.tail():查询数据的末尾5行
pandas.cut()
pandas.qcut() 基于分位数的离散化函数。基于秩或基于样本分位数将变量离散化为等大小桶。
pandas.date_range() 返回一个时间索引
df.apply() 沿相应轴应用函数
Series.value_counts() 返回不同数据的计数值
df.aggregate()
df.reset_index() 重新设置index,参数drop = True时会丢弃原来的索引,设置新的从0开始的索引。常与groupby()一起用
numpy.zeros()
df.loc[行标签,列标签] df.loc['a':'b']#选取ab两行数据 df.loc[:,'one']#选取one列的数据