1、安装jupyter
1.1、启用jupyter
2、 pandas介绍
2.1、pip3和pip的区别
2.2、pip或者pip3换源
2.2.1、临时修改
2.2.2、永久修改
2.2.3、国内其他pip源
3、Pandas数据结构
3.1、Series
3.1.1、 只有数据列表才能产生最简单的数据列表Series
标签索引的Series-toc" style="margin-left:80px;">3.1.2.创建标签索引Series
3.1.3、使用python字典创建Series
3.1.4、根据标签索引查询数据
3.2、DataFrame
3.2.1.根据多个字典序列创建dataframe
3.2.2.根据文件,mysql中读取创建dataframe
4、pandas的基本功能(pandas命令总结)
4.1、命令执行
4.2.查看信息函数
4.3.数据统计函数
5、Pandas查询选取数据
5.1、Pandas查询数据的几种方法
5.2、Pandas使用df.loc查询数据的方法
5.2.1、df[]
5.2.2、df.loc方法查询
5.2.3、df.iloc方法查询
6、Pandas数据转换函数map、apply、applymap ???
6.1、map用于Series值的转化
6.1.1、方法1:Series.map(dict)
6.1.2、方法2:Series.map(function)
6.2、apply用于Series和DataFrame的转换
6.2.1、Series.apply(function)
6.2.2、DataFrame.apply(function)
6.3、applymap用于DataFrame所值的转换
7、Pandas怎样新增数据列?
7.1、直接赋值的方法
7.2、df.apply方法
7.3、df.assign方法
7.4、按条件选择分组分别赋值
8、Pandas对缺失值的处理
8.1、读取excel的时候,忽略前几个行
8.2、检测空值
8.3、删除掉全是空值的列
8.4、删除掉全是空值的行
8.5、将分数列为空的填充为0分
8.6、将姓名的缺失值填充
8.7、将清洗好的excel保存
9、Pandas数据排序
9.1、读取数据
9.2、Series的排序
9.3、DataFrame的排序
9.3.1、单排序
9.3.2、多列排序
10、Pandas怎样实现DataFrame的Merge
10.1、理解merge时数量的对齐关系
10.1.1、one-to-one 一对一关系的merge
10.1.2、one-to-many 一对多关系的merge
10.1.3、many-to-many 多对多关系的merge
10.2、理解left join、right join、inner join、outer join的区别
10.2.1、inner join,默认为这个
10.2.2、left join
10.2.3、right join
10.2.4、outer join
10.3、如果出现非Key的字段重名怎么办
11、Pandas实现数据的合并concat
11.1、使用pandas.concat合并数据
11.1.1、默认的concat,参数为axis=0、join=outer、ignore_index=False
11.1.2、使用ignore_index=True可以忽略原来的索引
11.1.3、使用join=inner过滤掉不匹配的列
11.1.4、使用axis=1相当于添加新列
11.2、使用DataFrame.append按行合并数据
11.2.1、给1个dataframe添加另一个dataframe
11.2.2、忽略原来的索引ignore_index=True
11.2.3、可以一行一行的给DataFrame添加数据
11.3、merge和concat的区别
12、Pandas怎样实现groupby分组统计
12.1、分组使用聚合函数做数据统计
12.1.1、单个列groupby,查询所有数据列的统计
12.1.2、多个列groupby,查询所有数据列的统计
12.1.3、 同时查看多种数据统计
12.1.4、 查看单列的结果数据统计
12.1.5、不同列使用不同的聚合函数
12.2、遍历groupby的结果理解执行流程
12.2.1、遍历单个列聚合的分组
12.3、遍历多个列聚合的分组
12.4、实例分组探索天气数据
12.4.1、 查看每个月的最高温度
12.4.2、查看每个月的最高温度、最低温度、平均空气质量指数
13、Pandas处理日期数据
13.1、读取天气数据到dataframe
13.2、将日期列转换成pandas的日期
13.3、方便的对DatetimeIndex进行查询
13.4、生成日期范围
13.5、方便的获取周、月、季度
13.6、统计每周、每月、每个季度的最高温度
13.6.1、统计每周的数据
13.6.2、统计每个月的数据
13.6.3、统计每个季度的数据
13.7、python中时间日期格式化符号
准备工作:
链接:https://pan.baidu.com/s/1njXR5DK1REh5xqSMMrRUWw 提取码:nlxx
下面的文件都需要用到这个文件夹
1、安装jupyter
在windows里使用"win+r",弹窗出来之后敲击"cmd",输入"pip install jupyter"就能够安装了。若是使用的是国外源且下载速度较慢的话,我们可以使用"pip install -i + 国内源 + jupyter",来切换国内源,这样的话,下载速度就比较快了。
1.1、启用jupyter
我们需要下载最上边提供的链接文件,并且在这个文件里"Git Bash Here"
进入Git之后,输入下面的内容
$ jupyter notebook
执行上边的代码之后,会弹出一个窗口,然后执行就会得到下边的内容
2、 pandas介绍
python数据分析三剑客:numpy、pandas、Matplotlib
NumPy(Numerical Python):Python语言的一个扩展程序库,支持大量的维度数据与矩阵运算,针对数组提供大量的数学函数库 Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。 Matplotlib是一个python绘图包
pandas安装: 1、下载使用Python类库集成安装包:anaconda https://www.anaconda.com 当今最流行的Python数据分析发行版 已经安装了数据分析需要的几乎所有的类库
2、pip3 install pandas
本课程演示方式 使用jupyter Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown。 安装: pip3 install jupyter(需要python3.3或更高版本,或python2.7) 运行: jupyter notebook
2.1、pip3和pip的区别
使用pip install XXX 新安装的库会放在这个目录下面 python2.7/site-packages 使用pip3 install XXX 新安装的库会放在这个目录下面 python3.6/site-packages 如果使用python3执行程序,那么就不能import python2.7/site-packages中的库 那么问题来了,我没有py2.7啊 经过实践发现应该是这样的,应该是将包安装在路径里面第一个检索到的pip系列软件在的地方。
由图可以看到,我在一个没有pip的地方pip3了selenium包,所以,它自动检索,将包安装在了pip3第一次出现的地方。 c:\users\challenger\appdata\local\programs\python\python36\lib\site-packages 而且你用pip show是看不到相关信息的,只有pip3 show才行。 而在使用 pip 安装后
大家可以看到,安装位置已经变成:Location: d:\program\anaconda\envs\python36fordrl\lib\site-packages 因此,这也提示我们在使用pip包安装的时候,应该想好用哪个命令 原理 这个是我想起c语言里面 include“”和inluce<>的异同,一个首先检索当前路径是否有相关文件,一个直接进path环境变量里的库检索文件。 而这里也是如此,如果环境里有相关函数则直接使用,没有则到path路径找第一个符合的函数
2.2、pip或者pip3换源
因为国外源下载很慢,所以我们需要换国内源下载
2.2.1、临时修改
# 临时换为清华源下载
pip3 install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2.2、永久修改
首先在当前用户目录下建立文件夹.pip,然后在文件夹中创建pip.conf文件,再将源地址加进去即可。
mkdir ~/.pip vim ~/.pip/pip.conf # 然后将下面这两行复制进去就好了 [global] index-url = https://mirrors.aliyun.com/pypi/simple
2.2.3、国内其他pip源
- 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
- 阿里云:http://mirrors.aliyun.com/pypi/simple/
- 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
- 华中理工大学:http://pypi.hustunique.com/
- 山东理工大学:http://pypi.sdutlinux.org/
- 豆瓣:http://pypi.douban.com/simple/
3、Pandas数据结构
3.1、Series
Series是一种类似于一维数组的对象,它由一组数据(不同数据类型)以及一组与之相关的数据标签(即索引)组成。Seriers的交互式显示的字符串表示形式是索引在左边,值在右边。 类似一个有序的字典。
3.1.1、 仅有数据列表即可产生最简单的Series
>>> import pandas as pd
>>> s1 = pd.Series([1,5,2,7,'a'])
>>> s1
0 1
1 5
2 2
3 7
4 a
dtype: object
#查看每列数据类型,object为通用数据类型,一般某列中有多种数据类型,或者全为str,则类型为object。默认int、float类型的位数为操作系统位数。
########################
>>> s1 = pd.Series([1,5,2,7])
>>> s1
0 1
1 5
2 2
3 7
dtype: int64
######################
# 获得索引
>>> s1.index
RangeIndex(start=0, stop=4, step=1)
######################
# 获得数据
>>> s1.values
array([1, 5, 2, 7])
>>> s1[0]
1
>>> s1[1]
5
改变s1中的一些类型,会强制改变总的数据类型变为一致的。所以Series的数据类型是统一的。
3.1.2、创建一个具有标签索引的Series
>>> s2 = pd.Series([1, 'a', 5.2, 7], index=['d','b','a','c'])
>>> s2
d 1
b a
a 5.2
c 7
dtype: object
>>> s2.index
Index(['d', 'b', 'a', 'c'], dtype='object')
# 可以重复标签
>>> s2 = pd.Series([1, 'a', 5.2, 7], index=['d','b','a','a'])
>>> s2
d 1
b a
a 5.2
a 7
dtype: object
3.1.3、使用python字典创建Series
类似Python的字典dict
>>> sdata={"a":35000,"b":7200,"c":16000,"d":5000}
>>> sdata
{'a': 35000, 'b': 7200, 'c': 16000, 'd': 5000}
>>> s3 = pd.Series(sdata)
>>> s3
a 35000
b 7200
c 16000
d 5000
dtype: int64
3.1.4、 根据标签索引查询数据
>>> s2 = pd.Series([1, 'a', 5.2, 7], index=['d','b','a','c'])
>>> s2
d 1
b a
a 5.2
c 7
dtype: object
>>> s2["a"]
5.2
>>> type(s2["a"])
<class 'float'>
>>> s2[["b","a"]]
b a
a 5.2
dtype: object
>>> type(s2[["b","a"]])
<class 'pandas.core.series.Series'>
3.2、DataFrame
DataFrame是一个表格型的数据结构
- 每列可以是不同的值类型(数值、字符串、布尔值等)
- 既有行索引index,也有列索引columns
- 可以被看做由Series组成的字典
3.2.1、根据多个字典序列创建dataframe
>>> data={
... 'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
... 'year':[2000,2001,2002,2001,2002],
... 'pop':[1.5,1.7,3.6,2.4,2.9]
... }
>>> df = pd.DataFrame(data)
>>> df
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
>>> df.dtypes
state object
year int64
pop float64
dtype: object
>>> df.columns # 查看有几个列
Index(['state', 'year', 'pop'], dtype='object')
>>> df.index
RangeIndex(start=0, stop=5, step=1)
>>> df['state']
0 Ohio
1 Ohio
2 Ohio
3 Nevada
4 Nevada
Name: state, dtype: object
>>> df['state'][1]
'Ohio'
>>> df[['state','year']] # 拿多列的话,要使用"[[]]"
state year
0 Ohio 2000
1 Ohio 2001
2 Ohio 2002
3 Nevada 2001
4 Nevada 2002
3.2.2、根据从文件、mysql中读取创建dataframe
- 读取csv、txt文件 --> read_csv()
- 读取xlsx文件 --> read_excel()
- 读取mysql数据库 --> read_sql()
- 从网页读取table -->read_html()
>>> fpath = '/root/linux/script/pass_parameter/datas/read_test.csv'
>>> df = pd.read_csv(fpath)
>>> df
date prov isp pv uv
0 2020-04-26 hunan cmnet 2000 1000
1 2020-04-26 hunan cmnet 3000 1500
2 2020-04-26 hunan cmcc 4000 1000
3 2020-04-26 hubei ctc 2500 1000
4 2020-04-26 hubei cmcc 2000 1000
5 2020-04-26 hubei ctc 2100 1600
6 2020-04-27 hunan cmnet 4000 1700
7 2020-04-27 hunan cmnet 3200 1500
8 2020-04-27 hunan cmcc 2800 1600
9 2020-04-27 hubei ctc 2600 1400
10 2020-04-27 hubei cmcc 3800 1900
11 2020-04-27 hubei ctc 2400 1900
>>> url = 'http://ranking.promisingedu.com/qs'
>>> df = pd.read_html(url)[0]
>>> df
Ranking University English Name ... Overall Score Free
0 1 Massachusetts Institute of Technology (MIT) ... 100.0 免费评估
1 2 牛津大学University of Oxford ... 99.5 免费评估
2 3 Stanford University ... 98.7 免费评估
3 3 剑桥大学University of Cambridge ... 98.7 免费评估
4 5 Harvard University ... 98.0 免费评估
.. ... ... ... ... ...
496 494 Dongguk University ... 24.1 免费评估
497 494 Iowa State University ... 24.1 免费评估
498 494 Sogang University ... 24.1 免费评估
499 494 University of Rome "Tor Vergata" ... 24.1 免费评估
500 494 York University ... 24.1 免费评估
[501 rows x 11 columns]
4、pandas的基本功能(pandas命令总结)
- DataFrame() 创建一个DataFrame对象
- df.values 返回ndarray类型的对象
- df.shape 返回行列数
- df.index 获取行索引
- df.set_index 设置索引
- df.reset_index 重制索引
- df.columns 获取列索引
- df.rename 重新设置列名
- df.dtypes 查看每列数据类型
- df.axes 获取行及列索引
- df.T 行与列对调
- df.info() 打印DataFrame对象的信息
- df.head(i) 显示前 i 行数据
- df.tail(i) 显示后 i 行数据
- df.count() # 返回每一列中的非空值的个数
- df.value_counts() # 按值计数
- df.unique() # 唯一去重
- df.describe() 查看数据按列的统计信息
- df.sum() # 返回每一列的和, 无法计算返回空, 下同
- df.sum(numeric_only=True) # numeric_only=True代表只计算数字型元素, 下同
- df.max() # 返回每一列的最大值
- df.min() # 返回每一列的最小值
- df.argmax() # 返回最大值所在的,就是从0开始的系统下标
- df.argmin() # 返回最小值所在的
- df.idxmax() # 返回最大值所在的
- df.idxmin() # 返回最小值所在的
- df.mean() # 返回每一列的均值
- df.median() # 返回每一列的中位数
- df.var() # 返回每一列的方差
- df.std() # 返回每一列的标准差
- df.isnull() # 检查df中空值, NaN为True, 否则False, 返回一个布尔数组
- df.notnull() # 检查df中空值, 非NaN为True, 否则False, 返回一个布尔数组
4.1、命令执行
pf是一个可变数据类型,若是我们使用"df2=df"的形式来给df2赋值的话,df改变那么df2也会发生改变
>>> fpath = '/root/linux/script/pass_parameter/datas/read_test.csv' # 这个路径是安装本文章中最上边这个链接的文件路径
>>> df = pd.read_csv(fpath) # 用csv格式打开这个文件
>>> df
date prov isp pv uv
0 2020-04-26 hunan cmnet 2000 1000
1 2020-04-26 hunan cmnet 3000 1500
2 2020-04-26 hunan cmcc 4000 1000
3 2020-04-26 hubei ctc 2500 1000
4 2020-04-26 hubei cmcc 2000 1000
5 2020-04-26 hubei ctc 2100 1600
6 2020-04-27 hunan cmnet 4000 1700
7 2020-04-27 hunan cmnet 3200 1500
8 2020-04-27 hunan cmcc 2800 1600
9 2020-04-27 hubei ctc 2600 1400
10 2020-04-27 hubei cmcc 3800 1900
11 2020-04-27 hubei ctc 2400 1900
>>> df
date prov isp pv uv
0 2020-04-26 hunan cmnet 2000 1000
1 2020-04-26 hunan cmnet 3000 1500
2 2020-04-26 hunan cmcc 4000 1000
3 2020-04-26 hubei ctc 2500 1000
4 2020-04-26 hubei cmcc 2000 1000
5 2020-04-26 hubei ctc 2100 1600
6 2020-04-27 hunan cmnet 4000 1700
7 2020-04-27 hunan cmnet 3200 1500
8 2020-04-27 hunan cmcc 2800 1600
9 2020-04-27 hubei ctc 2600 1400
10 2020-04-27 hubei cmcc 3800 1900
11 2020-04-27 hubei ctc 2400 1900
4.2、查看信息类函数
# 返回ndarray类型的对象
>>> df.values
array([['2020-04-26', 'hunan', 'cmnet', 2000, 1000],
['2020-04-26', 'hunan', 'cmnet', 3000, 1500],
['2020-04-26', 'hunan', 'cmcc', 4000, 1000],
['2020-04-26', 'hubei', 'ctc', 2500, 1000],
['2020-04-26', 'hubei', 'cmcc', 2000, 1000],
['2020-04-26', 'hubei', 'ctc', 2100, 1600],
['2020-04-27', 'hunan', 'cmnet', 4000, 1700],
['2020-04-27', 'hunan', 'cmnet', 3200, 1500],
['2020-04-27', 'hunan', 'cmcc', 2800, 1600],
['2020-04-27', 'hubei', 'ctc', 2600, 1400],
['2020-04-27', 'hubei', 'cmcc', 3800, 1900],
['2020-04-27', 'hubei', 'ctc', 2400, 1900]], dtype=object)
# 查看数据的形状,返回(行数、列数)
>>> df.shape
(12, 5)
#查看行索引
>>> df.index
RangeIndex(start=0, stop=12, step=1)
>>> df2 = df.set_index('date') # 以"date"作为key排序
>>> df2
prov isp pv uv
date
2020-04-26 hunan cmnet 2000 1000
2020-04-26 hunan cmnet 3000 1500
2020-04-26 hunan cmcc 4000 1000
2020-04-26 hubei ctc 2500 1000
2020-04-26 hubei cmcc 2000 1000
2020-04-26 hubei ctc 2100 1600
2020-04-27 hunan cmnet 4000 1700
2020-04-27 hunan cmnet 3200 1500
2020-04-27 hunan cmcc 2800 1600
2020-04-27 hubei ctc 2600 1400
2020-04-27 hubei cmcc 3800 1900
2020-04-27 hubei ctc 2400 1900
# "inplace=True"表示在原基础上作出修改;"drop=True",表示把行标去掉
>>> df2.reset_index(inplace = True, drop = True)
>>> df2
prov isp pv uv
0 hunan cmnet 2000 1000
1 hunan cmnet 3000 1500
2 hunan cmcc 4000 1000
3 hubei ctc 2500 1000
4 hubei cmcc 2000 1000
5 hubei ctc 2100 1600
6 hunan cmnet 4000 1700
7 hunan cmnet 3200 1500
8 hunan cmcc 2800 1600
9 hubei ctc 2600 1400
10 hubei cmcc 3800 1900
11 hubei ctc 2400 1900
# 获得列索引
>>> df.columns
Index(['date', 'prov', 'isp', 'pv', 'uv'], dtype='object')
#重新设置列表名,必须要对应输入所有的列
df2 = df.copy() # 因为DataFrame是可变的数据类型,所以我们要使用copy拷贝他的值
df2.columns=['a','b','c','d','e']
df2
#重新设置列表名,可以只设置一部分
>>>df2.rename(columns = {'a':'日期','b':'省份','c':'运营商','d':'pv','e':'uv'}, inplace = True)
>>> df2
日期 省份 运营商 pv uv
0 2020-04-26 hunan cmnet 2000 1000
1 2020-04-26 hunan cmnet 3000 1500
2 2020-04-26 hunan cmcc 4000 1000
3 2020-04-26 hubei ctc 2500 1000
4 2020-04-26 hubei cmcc 2000 1000
5 2020-04-26 hubei ctc 2100 1600
6 2020-04-27 hunan cmnet 4000 1700
7 2020-04-27 hunan cmnet 3200 1500
8 2020-04-27 hunan cmcc 2800 1600
9 2020-04-27 hubei ctc 2600 1400
10 2020-04-27 hubei cmcc 3800 1900
11 2020-04-27 hubei ctc 2400 1900
#查看每列数据类型,object为通用数据类型,一般某列中有多种数据类型,或者全为str,则类型为object。默认int、float类型的位数为操作系统位数。
>>> df.dtypes
date object
prov object
isp object
pv int64
uv int64
dtype: object
##################################
# 显示行和列表以及类型
>>> df.axes
[RangeIndex(start=0, stop=12, step=1), Index(['date', 'prov', 'isp', 'pv', 'uv'], dtype='object')]
#############################
# 转置,没有在原来基础上做出改变
>>> df.T
0 1 2 3 ... 8 9 10 11
date 2020-04-26 2020-04-26 2020-04-26 2020-04-26 ... 2020-04-27 2020-04-27 2020-04-27 2020-04-27
prov hunan hunan hunan hubei ... hunan hubei hubei hubei
isp cmnet cmnet cmcc ctc ... cmcc ctc cmcc ctc
pv 2000 3000 4000 2500 ... 2800 2600 3800 2400
uv 1000 1500 1000 1000 ... 1600 1400 1900 1900
[5 rows x 12 columns]
###########################
>>> df.head(5)
date prov isp pv uv
0 2020-04-26 hunan cmnet 2000 1000
1 2020-04-26 hunan cmnet 3000 1500
2 2020-04-26 hunan cmcc 4000 1000
3 2020-04-26 hubei ctc 2500 1000
4 2020-04-26 hubei cmcc 2000 1000
>>> df.tail(5)
date prov isp pv uv
7 2020-04-27 hunan cmnet 3200 1500
8 2020-04-27 hunan cmcc 2800 1600
9 2020-04-27 hubei ctc 2600 1400
10 2020-04-27 hubei cmcc 3800 1900
11 2020-04-27 hubei ctc 2400 1900
# 只对数值类进行计算。这些百分号表示箱型图的意思
>>> df.describe()
pv uv
count 12.000000 12.000000
mean 2866.666667 1425.000000
std 743.863787 346.738046
min 2000.000000 1000.000000
25% 2325.000000 1000.000000
50% 2700.000000 1500.000000
75% 3350.000000 1625.000000
max 4000.000000 1900.000000
4.3、数据统计类函数
# 返回每一列中的非空值的个数
>>> df.count()
date 12
prov 12
isp 12
pv 12
uv 12
dtype: int64
##########################
# 按值计数
>>> df["prov"].value_counts()
hunan 6
hubei 6
Name: prov, dtype: int64
#############
# 唯一去重
>>> df["prov"].unique()
array(['hunan', 'hubei'], dtype=object)
5、Pandas查询选取数据
5.1、Pandas查询数据的几种方法
- df[]按行列选取,这种情况一次只能选取行或者列
- df.loc方法,根据行、列的标签值查询
- df.iloc方法,根据行、列的数字位置查询,根据索引定位
- df.query方法
5.2、Pandas使用df.loc查询数据的方法
- 使用单个label值查询数据
- 使用值列表批量查询
- 使用数值区间进行范围查询
- 使用条件表达式查询
- 调用函数查询
5.2.1、df[]
df[]按行列选取,这种情况一次只能选取行或者列
>>> df = pd.DataFrame(np.random.rand(25).reshape([5, 5]), index=['A', 'B', 'C', 'D', 'E'], columns=['c1', 'c2', 'c3', 'c4', 'c5'])
>>> df
c1 c2 c3 c4 c5
A 0.678642 0.600271 0.715437 0.613857 0.618137
B 0.326720 0.742239 0.124217 0.844608 0.560314
C 0.199805 0.614843 0.521589 0.530966 0.166661
D 0.575750 0.592821 0.492156 0.200419 0.437495
E 0.863142 0.480158 0.339556 0.904514 0.955364
###################
# 获取c1列
>>> df.c1
A 0.678642
B 0.326720
C 0.199805
D 0.575750
E 0.863142
Name: c1, dtype: float64
###################
# 获取c1、c2两列
>>> df[["c1","c2"]]
c1 c2
A 0.678642 0.600271
B 0.326720 0.742239
C 0.199805 0.614843
D 0.575750 0.592821
E 0.863142 0.480158
##########################
# 获取索引为A-C行数据
>>> df["A":"C"]
c1 c2 c3 c4 c5
A 0.678642 0.600271 0.715437 0.613857 0.618137
B 0.326720 0.742239 0.124217 0.844608 0.560314
C 0.199805 0.614843 0.521589 0.530966 0.166661
##########################
# 获取2-3行数据,左闭右开
>>> df[1:3]
c1 c2 c3 c4 c5
B 0.326720 0.742239 0.124217 0.844608 0.560314
C 0.199805 0.614843 0.521589 0.530966 0.166661
5.2.2、df.loc方法查询
df.loc方法,根据行、列的标签值查询
有点类似list的切片
# 前边确定行,后边确定列
>>> df.loc["A":"D", :]
c1 c2 c3 c4 c5
A 0.678642 0.600271 0.715437 0.613857 0.618137
B 0.326720 0.742239 0.124217 0.844608 0.560314
C 0.199805 0.614843 0.521589 0.530966 0.166661
D 0.575750 0.592821 0.492156 0.200419 0.437495
>>> df.loc["A":"D","c1"]
A 0.678642
B 0.326720
C 0.199805
D 0.575750
Name: c1, dtype: float64
>>> df.loc["A":"D","c1":"c3"]
c1 c2 c3
A 0.678642 0.600271 0.715437
B 0.326720 0.742239 0.124217
C 0.199805 0.614843 0.521589
D 0.575750 0.592821 0.492156
>>> df.loc["A","c2"]
0.6002706557290689
>>> df.loc['B':'D','c5':'c1':-1]
c5 c4 c3 c2 c1
B 0.560314 0.844608 0.124217 0.742239 0.326720
C 0.166661 0.530966 0.521589 0.614843 0.199805
D 0.437495 0.200419 0.492156 0.592821 0.575750
# 找出c2中所有大于0.5的值,并且输出符合条件的全部表格内容
>>> df.loc[df["c2"]>0.5,:]
c1 c2 c3 c4 c5
A 0.678642 0.600271 0.715437 0.613857 0.618137
B 0.326720 0.742239 0.124217 0.844608 0.560314
C 0.199805 0.614843 0.521589 0.530966 0.166661
D 0.575750 0.592821 0.492156 0.200419 0.437495
#########################
>>> df.loc[(df["c2"]>0.2) & (df["c3"]< 0.8)]
c1 c2 c3 c4 c5
A 0.678642 0.600271 0.715437 0.613857 0.618137
B 0.326720 0.742239 0.124217 0.844608 0.560314
C 0.199805 0.614843 0.521589 0.530966 0.166661
D 0.575750 0.592821 0.492156 0.200419 0.437495
E 0.863142 0.480158 0.339556 0.904514 0.955364
>>> def query_my_data(df):
... return ((df['c3']>0.2) & (df["c4"]<0.8))
...
##################
>>> query_my_data
<function query_my_data at 0x7f24aff36d08>
######################
>>> df.loc[query_my_data, :]
c1 c2 c3 c4 c5
A 0.678642 0.600271 0.715437 0.613857 0.618137
C 0.199805 0.614843 0.521589 0.530966 0.166661
D 0.575750 0.592821 0.492156 0.200419 0.437495
5.2.3、df.iloc方法查询
同df.loc类似,根据索引定位
# 提取2-3行,1-2列的数据
>>> df.iloc[1:3,0:2]
c1 c2
B 0.326720 0.742239
C 0.199805 0.614843
##############################
# 提取第二第三行,第4列数据
>>> df.iloc[[1,2],[3]]
c4
B 0.844608
C 0.530966
########################
# 提取指定位置单个数据
>>> df.iloc[3,4]
0.43749457263810054
6、Pandas的数据转换函数map、apply、applymap ⭐⭐⭐
数据转换函数对比:map、apply、applymap:
- map:只用于Series,实现每个值->值的映射;
- apply:用于Series实现每个值的处理,用于Dataframe实现某个轴的Series的处理;
- applymap:只能用于DataFrame,用于处理该DataFrame的每个元素;
>>> import pandas as pd
>>> df = pd.read_csv("read_test.csv")
>>> df.head()
date prov isp pv uv
0 2020-04-26 hunan cmnet 2000 1000
1 2020-04-26 hunan cmnet 3000 1500
2 2020-04-26 hunan cmcc 4000 1000
3 2020-04-26 hubei ctc 2500 1000
4 2020-04-26 hubei cmcc 2000 1000
6.1、map用于Series值的转化
实例:将股票代码英文转换成中文名字
Series.map(dict) or Series.map(function)均可
>>> dict_isp_names = {
... "cmnet": "中国移动",
... "cmcc": "中国联通",
... "ctc": "中国电信"
... }
6.1.1、方法1:Series.map(dict)
# map函数只对Series生效
>>> df["isp1"]=df["isp"].map(dict_isp_names)
>>> df.head()
date prov isp pv uv isp1
0 2020-04-26 hunan cmnet 2000 1000 中国移动
1 2020-04-26 hunan cmnet 3000 1500 中国移动
2 2020-04-26 hunan cmcc 4000 1000 中国联通
3 2020-04-26 hubei ctc 2500 1000 中国电信
4 2020-04-26 hubei cmcc 2000 1000 中国联通
6.1.2、方法2:Series.map(function)
function的参数是Series的每个元素的值
>>> df["isp2"]=df["isp"].map(lambda x : dict_isp_names[x])
>>> df.head()
date prov isp pv uv isp1 isp2
0 2020-04-26 hunan cmnet 2000 1000 中国移动 中国移动
1 2020-04-26 hunan cmnet 3000 1500 中国移动 中国移动
2 2020-04-26 hunan cmcc 4000 1000 中国联通 中国联通
3 2020-04-26 hubei ctc 2500 1000 中国电信 中国电信
4 2020-04-26 hubei cmcc 2000 1000 中国联通 中国联通
>>> df['float_column'] = 5.67435 # 没有那列的话,会自动添加
>>> df.head()
date prov isp pv uv isp1 isp2 float_column
0 2020-04-26 hunan cmnet 2000 1000 中国移动 中国移动 5.67435
1 2020-04-26 hunan cmnet 3000 1500 中国移动 中国移动 5.67435
2 2020-04-26 hunan cmcc 4000 1000 中国联通 中国联通 5.67435
3 2020-04-26 hubei ctc 2500 1000 中国电信 中国电信 5.67435
4 2020-04-26 hubei cmcc 2000 1000 中国联通 中国联通 5.67435
>>> df['float_column_1'] = df['float_column'].map(lambda x: '%.3f'%x)
>>> df.head()
date prov isp pv uv isp1 isp2 float_column float_column_1
0 2020-04-26 hunan cmnet 2000 1000 中国移动 中国移动 5.67435 5.674
1 2020-04-26 hunan cmnet 3000 1500 中国移动 中国移动 5.67435 5.674
2 2020-04-26 hunan cmcc 4000 1000 中国联通 中国联通 5.67435 5.674
3 2020-04-26 hubei ctc 2500 1000 中国电信 中国电信 5.67435 5.674
4 2020-04-26 hubei cmcc 2000 1000 中国联通 中国联通 5.67435 5.674
6.2、apply用于Series和DataFrame的转换
- Series.apply(function), 函数的参数是每个值
- DataFrame.apply(function), 函数的参数是Series
6.2.1、Series.apply(function)
function的参数是Series的每个值
>>> df["isp3"]=df["isp"].apply(lambda x : dict_isp_names[x])
>>> df.head()
date prov isp pv uv isp1 isp2 float_column float_column_1 isp3
0 2020-04-26 hunan cmnet 2000 1000 中国移动 中国移动 5.67435 5.674 中国移动
1 2020-04-26 hunan cmnet 3000 1500 中国移动 中国移动 5.67435 5.674 中国移动
2 2020-04-26 hunan cmcc 4000 1000 中国联通 中国联通 5.67435 5.674 中国联通
3 2020-04-26 hubei ctc 2500 1000 中国电信 中国电信 5.67435 5.674 中国电信
4 2020-04-26 hubei cmcc 2000 1000 中国联通 中国联通 5.67435 5.674 中国联通
6.2.2、DataFrame.apply(function)
function的参数是对应轴的Series
>>> df["total"]=df[["pv","uv"]].apply(lambda x : x.sum(), axis=1)
>>> df.head()
date prov isp pv uv isp1 isp2 float_column float_column_1 isp3 total
0 2020-04-26 hunan cmnet 2000 1000 中国移动 中国移动 5.67435 5.674 中国移动 3000
1 2020-04-26 hunan cmnet 3000 1500 中国移动 中国移动 5.67435 5.674 中国移动 4500
2 2020-04-26 hunan cmcc 4000 1000 中国联通 中国联通 5.67435 5.674 中国联通 5000
3 2020-04-26 hubei ctc 2500 1000 中国电信 中国电信 5.67435 5.674 中国电信 3500
4 2020-04-26 hubei cmcc 2000 1000 中国联通 中国联通 5.67435 5.674 中国联通 3000
注意这个代码: 1、apply是在df[['pv','uv']]这个DataFrame上调用; 2、lambda x的x是一个Series,axis=1表示跨列,axis=0 表示跨行
>>> df.loc['total'] = df[['pv','uv']].apply(lambda x : x.sum(), axis = 0)
>>> df.tail()
date prov isp pv uv isp1 isp2 float_column float_column_1 isp3 total
8 2020-04-27 hunan cmcc 2800.0 1600.0 中国联通 中国联通 5.67435 5.674 中国联通 4400.0
9 2020-04-27 hubei ctc 2600.0 1400.0 中国电信 中国电信 5.67435 5.674 中国电信 4000.0
10 2020-04-27 hubei cmcc 3800.0 1900.0 中国联通 中国联通 5.67435 5.674 中国联通 5700.0
11 2020-04-27 hubei ctc 2400.0 1900.0 中国电信 中国电信 5.67435 5.674 中国电信 4300.0
total NaN NaN NaN 34400.0 17100.0 NaN NaN NaN NaN NaN NaN
6.3、applymap用于DataFrame所有值的转换
>>> sub_df = df[['pv', 'uv']]
>>> sub_df.head()
pv uv
0 2000.0 1000.0
1 3000.0 1500.0
2 4000.0 1000.0
3 2500.0 1000.0
4 2000.0 1000.0
############################
# 将这些数字取整数,应用于所有元素
>>> sub_df = sub_df.applymap(lambda x : int(x))
# 直接修改原df的这几列
>>> sub_df.head()
pv uv
0 2000 1000
1 3000 1500
2 4000 1000
3 2500 1000
4 2000 1000
7、Pandas怎样新增数据列?
在进行数据分析时,经常需要按照一定条件创建新的数据列,然后进行进一步分析。
- 直接赋值
- df.apply方法
- df.assign方法
- 按条件选择分组分别赋值
>>> import pandas as pd
# 读取csv数据到DataFrame
>>> fpath = "beijing_tianqi_2018.csv"
>>> df = pd.read_csv(fpath)
>>> df.head()
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
0 2018-01-01 3℃ -6℃ 晴~多云 东北风 1-2级 59 良 2
1 2018-01-02 2℃ -5℃ 阴~多云 东北风 1-2级 49 优 1
2 2018-01-03 2℃ -5℃ 多云 北风 1-2级 28 优 1
3 2018-01-04 0℃ -8℃ 阴 东北风 1-2级 28 优 1
4 2018-01-05 3℃ -6℃ 多云~晴 西北风 1-2级 50 优 1
7.1、直接赋值的方法
# 替换掉温度的后缀℃
>>> df["bWendu"] = df["bWendu"].str.replace("℃", "").astype('int64')
>>> df["yWendu"] = df["yWendu"].str.replace("℃", "").astype('int64')
>>> df.head()
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
0 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 良 2
1 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 优 1
2 2018-01-03 2 -5 多云 北风 1-2级 28 优 1
3 2018-01-04 0 -8 阴 东北风 1-2级 28 优 1
4 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 优 1
# 注意,df["bWendu"]其实是一个Series,后边的减法返回的是Series
>>> df["wencha"] = df["bWendu"] - df["yWendu"]
>>> df.head()
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel wencha
0 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 良 2 9
1 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 优 1 7
2 2018-01-03 2 -5 多云 北风 1-2级 28 优 1 7
3 2018-01-04 0 -8 阴 东北风 1-2级 28 优 1 8
4 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 优 1 9
7.2、df.apply方法
Apply a function along an axis of the DataFrame.
Objects passed to the function are Series objects whose index is either the DataFrame’s index (axis=0) or the DataFrame’s columns (axis=1).
- 如果最高温度大于33度就是高温
- 低于-10度是低温
- 否则是常温
>>> def get_wendu_type(x):
... if x["bWendu"] > 33:
... return "高温"
... if x["yWendu"] < -10:
... return '低温'
... return "常温"
...
# 注意需要设置axis==1,这是series的index是columns
>>> df["wendu_type"] = df.apply(get_wendu_type,axis=1)
>>> df.head()
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel wencha wendu_type
0 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 良 2 9 常温
1 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 优 1 7 常温
2 2018-01-03 2 -5 多云 北风 1-2级 28 优 1 7 常温
3 2018-01-04 0 -8 阴 东北风 1-2级 28 优 1 8 常温
4 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 优 1 9 常温
###################
# 查看温度类型的计数
>>> df["wendu_type"].value_counts()
常温 328
高温 29
低温 8
Name: wendu_type, dtype: int64
>>> df2 = df["wendu_type"].value_counts()
>>> for k,v in df2.iteritems():
... print(k,v)
...
常温 328
高温 29
低温 8
7.3、df.assign方法
Assign new columns to a DataFrame.(将新列分配给DataFrame。 )
Returns a new object with all original columns in addition to new ones.(返回一个新对象,除新列外,还包含所有原始列 )
>>> df.assign(
... yWendu_huashi = lambda x : x["yWendu"] * 9 / 5 + 32,
... bWendu_huashi = lambda x : x["bWendu"] * 9 / 5 + 32
... ).head()
ymd bWendu yWendu tianqi fengxiang ... aqiLevel wencha wendu_type yWendu_huashi bWendu_huashi
0 2018-01-01 3 -6 晴~多云 东北风 ... 2 9 常温 21.2 37.4
1 2018-01-02 2 -5 阴~多云 东北风 ... 1 7 常温 23.0 35.6
2 2018-01-03 2 -5 多云 北风 ... 1 7 常温 23.0 35.6
3 2018-01-04 0 -8 阴 东北风 ... 1 8 常温 17.6 32.0
4 2018-01-05 3 -6 多云~晴 西北风 ... 1 9 常温 21.2 37.4
[5 rows x 13 columns]
7.4、按条件选择分组分别赋值
按条件先选择数据,然后对这部分数据赋值新列
# 先创建空列(这是第一种创建新列的方法)
>>> df["wencha_type"] = ''
>>> df.loc[df["bWendu"]-df["yWendu"] > 10, "wencha_type"] = "温差大"
>>> df.loc[df["bWendu"]-df["yWendu"] <= 10, "wencha_type"] = "温差正常"
>>> df.head()
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel wencha wendu_type wencha_type
0 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 良 2 9 常温 温差正常
1 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 优 1 7 常温 温差正常
2 2018-01-03 2 -5 多云 北风 1-2级 28 优 1 7 常温 温差正常
3 2018-01-04 0 -8 阴 东北风 1-2级 28 优 1 8 常温 温差正常
4 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 优 1 9 常温 温差正常
##############
>>> df["wencha_type"].value_counts()
温差正常 187
温差大 178
Name: wencha_type, dtype: int64
8、Pandas对缺失值的处理
Pandas使用这些函数处理缺失值:
- isnull和notnull:检测是否是空值,可用于df和series
- dropna:丢弃、删除缺失值
- axis : 删除行还是列,{0 or ‘index’, 1 or ‘columns’}, default 0
- how : 如果等于any则任何值为空都删除,如果等于all则所有值都为空才删除
- inplace : 如果为True则修改当前df,否则返回新的df
- fillna:填充空值
- value:用于填充的值,可以是单个值,或者字典(key是列名,value是值)
- method : 等于ffill,即使用前一个不为空的值填充forword fill;等于bfill,即使用后一个不为空的值填充backword fill
- axis : 按行还是列填充,{0 or ‘index’, 1 or ‘columns’}
- inplace : 如果为True则修改当前df,否则返回新的df
import pandas as pd
########################
>>> studf = pd.read_excel("student_excel.xlsx")
>>> studf
Unnamed: 0 Unnamed: 1 Unnamed: 2 Unnamed: 3
0 NaN NaN NaN NaN
1 NaN 姓名 科目 分数
2 NaN 小明 语文 85
3 NaN NaN 数学 80
4 NaN NaN 英语 90
5 NaN NaN NaN NaN
6 NaN 小王 语文 85
7 NaN NaN 数学 NaN
8 NaN NaN 英语 90
9 NaN NaN NaN NaN
10 NaN 小刚 语文 85
11 NaN NaN 数学 80
12 NaN NaN 英语 90
############################
>>> studf = pd.read_excel("student_excel.xlsx", skiprows=1)
>>> studf
Unnamed: 0 Unnamed: 1 Unnamed: 2 Unnamed: 3
0 NaN 姓名 科目 分数
1 NaN 小明 语文 85
2 NaN NaN 数学 80
3 NaN NaN 英语 90
4 NaN NaN NaN NaN
5 NaN 小王 语文 85
6 NaN NaN 数学 NaN
7 NaN NaN 英语 90
8 NaN NaN NaN NaN
9 NaN 小刚 语文 85
10 NaN NaN 数学 80
11 NaN NaN 英语 90
#########################
# skiprows=2,跳过前边两行
studf = pd.read_excel("student_excel.xlsx", skiprows=2)
>>> studf
Unnamed: 0 姓名 科目 分数
0 NaN 小明 语文 85.0
1 NaN NaN 数学 80.0
2 NaN NaN 英语 90.0
3 NaN NaN NaN NaN
4 NaN 小王 语文 85.0
5 NaN NaN 数学 NaN
6 NaN NaN 英语 90.0
7 NaN NaN NaN NaN
8 NaN 小刚 语文 85.0
9 NaN NaN 数学 80.0
10 NaN NaN 英语 90.0
读取的时候,若是出现“xlrd.biffh.XLRDError: Excel xlsx file; not supported”的情况,那就是你的xlrd版本过高我安装的xlrd版本为2以上的版本,程序报错主要是xlrd的2.0以上版本不支持后缀名.xlsx文件的读取,支持.xls文件的读取。
或者你也可以这么使用
# 两个命令,选其中一个就行了
studf = pd.read_excel("student_excel.xlsx", skiprows=2,engine="openpyxl")
# 或者安装"pip3 install xlrd==1.2.0"的版本,再执行下面那个命令
studf = pd.read_excel("student_excel.xlsx", skiprows=2)
# 没有空值的就为False,有就为True
>>> studf.isnull()
Unnamed: 0 姓名 科目 分数
0 True False False