20200303 pandas

昨日内容

1.数据分析的概述 将爬虫爬下来的数据,进行分析,以前使用的是R语言来进行分析,现在的使用Python中 的数据分析库 

2.数据分析的应用 淘宝购物之后,商品推荐,会根据之前用户的浏览日志推荐相关的产品,用户画像 抖音(百度过来的推荐算法团队),快手的推荐算法,投喂 看电影,电影推荐等 

3.数据分析的步骤 提出需求(产品经理或者leader提出) 收集数据爬虫爬取的数据或者掏钱买的 公司自己产生的各种数据 进行数据清洗 数据详细分析,得出结论,图表的形式展示结论 

4.写代码的工具 以前使用的是pycharm,但是现在本次课程使用的是 jupyter 

5.jupyter的安装 命令行安装和启动 (不推荐) pip3 install jupyter jupyter notebook 缺点是:需要额外的在进行安装numpy anaconda安装(推荐) 直接官网下载,傻瓜式安装 点击lunch按钮,直接启动 

6.jupyternotebook的使用介绍 注意:notebook的文件后缀,是以 ipynb 结尾 

7.jupyternotebook的快捷键
两个模式: 编辑模式:光标闪动,颜色是绿色 命令模式:按esc,就能从编辑模式到命令行模式 常见的6个快捷键: 运行当前的代码:crtl + enter 运行当前的代码,并且运行完成之后自动的选择下一个单元格:shift+enter 删除当前单元格:切换到命令行模式,按dd直接删除 在当前单元格的上方添加一个单元格:切换到命令行模式,按a添加 在当前单元格的下方添加一个单元格:切换到命令行模式,按b添加 切换代码模式到标记模式:切换到命令模式,按m进行切换 如果命令不够,可以去键盘处打开命令配置查看 

8.numpy的介绍 核心数据结构是:ndarray 

9.numpy的基本属性 dtype: 数据类型 ndim:数组维度 shape:数组维度,以元组的形式展示 T:转置 (对高维数组而言) 
    
10.numpy数组的创建方式 np.array([1,2,3,3,4]) np.arange() np.linspace() np.linspace? #### 查看函数的使用方法 np.zeros(5) np.ones(5) 

11.数组的索引 一维数组索引 和python的列表用法是一样,都是从0开始 二维数组索引 存在行索引和列索引,需要逗号进行分割,逗号前面是行索引,后面是列索引 布尔型索引 数组可以把布尔值当成索引,来获取对应的值 

12.数组的切片 一维数组切片 和Python中的列表的切片一样,也都是从0开始,前包后不包 二维数组的切片 存在行索引,和列索引,需要逗号进行分割,逗号前面是行切片,后面是列切片

13.通用函数 abs() : 绝对值 ceil(): 向上取整 ceil(4.3) ===> 5 floor():向下取整 floor(5.7) ===> 5 rint() : 四舍五入 rint(3.4) ====>3 sum(): 求和 cumsum() max() min() 
                
14.随机数函数 np.random.rand() np.random.randint() np.random.shuffle() 15.向量运算和矢量运算

pandas

简介

pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

数据结构

Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。

Time- Series:以时间为索引的Series。

DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。

Panel :三维的数组,可以理解为DataFrame的容器。

Panel4D:是像Panel一样的4维数据容器。

PanelND:拥有factory集合,可以创建像Panel4D一样N维命名容器的模块。

安装

pip install pandas

使用

import pandas as pd
import numpy as np

Series 四种定义方式

s1 = pd.Series([2,3,4,5,6])
s1

0 2
1 3
2 4
3 5
4 6
dtype: int64

s2 = pd.Series([2,3,4,5,6],index=['a','b','c','d','e'])
s2

a 2
b 3
c 4
d 5
e 6
dtype: int64

s1[1]

3

s2['b']

3

s2[2]    # 数字型索引和自定义索引是共存的

4

a3 = pd.Series({'a':2,'b':2})
a3

a 2
b 2
dtype: int64

s4 = pd.Series(0,index=['a','b','c'])
s4

a 0
b 0
c 0
dtype: int64

Series的特性

pd.Series(np.array([1,2,3,4,5]))

0 1
1 2
2 3
3 4
4 5
dtype: int32

矢量运算

s1 * 2

0 4
1 6
2 8
3 10
4 12
dtype: int64

s1

0 2
1 3
2 4
3 5
4 6
dtype: int64

布尔型索引

s1[s1>4]

3 5
4 6
dtype: int64

通用函数

abs(s1)

0 2
1 3
2 4
3 5
4 6
dtype: int64

sum(s1)

20

# 适用于numpy

缺失值数据的处理

st = pd.Series({'sean':12,'yang':15,'cloud':20,'bella':23})
st   # 得到一个Series

sean 12
yang 15
cloud 20
bella 23
dtype: int64


obj1 = pd.Series(st,index=['sean','yang','cloud','rocky'])
obj1

sean 12.0
yang 15.0
cloud 20.0
rocky NaN
dtype: float64

NAN

# NaN 即是所谓的缺失值

1.为啥值得类型从整型变为了浮点型

因为NaN是浮点数类型,其他值兼容,会强制变为浮点型

type(np.nan)

float

2.nan等于谁

np.nan == np.nan

False

3.填充nan

obj1.fillna(0)

sean 12.0
yang 15.0
cloud 20.0
rocky 0.0
dtype: float64

obj1   # 拷贝一份,填充

sean 12.0
yang 15.0
cloud 20.0
rocky NaN
dtype: float64

4.删除nan所在的行

obj1.dropna()

sean 12.0
yang 15.0
cloud 20.0
dtype: float64

obj1    # 拷贝了一份删除,但是原obj没有更改

sean 12.0
yang 15.0
cloud 20.0
rocky NaN
dtype: float64

obj1.dropna(inplace=True)   # inplace=True 在对象本身进行操作
obj1

sean 12.0
yang 15.0
cloud 20.0
dtype: float64

运算

两个Series的运算

### 向量运算
s4 = pd.Series({'height':170,'age':18,'salary':2000})
s4

height 170
age 18
salary 2000
dtype: int64

s5 = pd.Series({'height':110,'age':20,'salary':2367})
s5

height 110
age 20
salary 2367
dtype: int64

s4 + s5   # 索引所对应的值进行加减乘除

height 280
age 38
salary 4367
dtype: int64

两个键值都会缺失

s6 = pd.Series({'name':110,'age':20,'salary':2367})
s6

name 110
age 20
salary 2367
dtype: int64

s4

height 170
age 18
salary 2000
dtype: int64

s4 + s6

age 38.0
height NaN
name NaN
salary 4367.0
dtype: float64

Series索引

s1

0 2
1 3
2 4
3 5
4 6
dtype: int64

花式索引

中括号中套中括号,内层括号中写索引下标

# 获取246 三个值

s1[[0,2,4]]

0 2
2 4
4 6
dtype: int64

arr = np.array([1,2,3,4,5])
arr[[0,3,2]]

array([1, 4, 3])

整数索引

sr = pd.Series(np.arange(10))
sr

0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
dtype: int32

sr1 = sr[3:].copy()
sr1

3 3
4 4
5 5
6 6
7 7
8 8
9 9
dtype: int32

# 想要获取值为3   不能直接索引取值了
sr1.iloc[0]   # iloc == index + location   以索引下标取值

3

sr1.loc[6]     # 以标签取值

6

DataFrame

DataFrame 是一个表个性的数据结构,相当于一个二维数组,含有一组有序的列.他可以看做成由Series组成的字典,并且共用一个索引

df = pd.DataFrame({'one':[1,2,3,4],'two':[5,6,7,8]})
df

创建方式

one two
0 1 5
1 2 6
2 3 7
3 4 8
df['two']

0 5
1 6
2 7
3 8
Name: two, dtype: int64

df['one'].iloc[3]    # 先获取列,在获取行

4

DataFrame常见的属性

df.index   # 获取行索引

RangeIndex(start=0, stop=4, step=1)

df.columns  # 获取列索引

Index(['one', 'two'], dtype='object')

df.T    # 转置,行变列
0 1 2 3
one 1 2 3 4
two 5 6 7 8
df.values    # 获取值

array([[1, 5],
[2, 6],
[3, 7],
[4, 8]], dtype=int64)

df
one two
0 1 5
1 2 6
2 3 7
3 4 8
df.describe()   # 展示DataFrame表格的属性
one two
count 4.000000 4.000000
mean 2.500000 6.500000
std 1.290994 1.290994
min 1.000000 5.000000
25% 1.750000 5.750000
50% 2.500000 6.500000
75% 3.250000 7.250000
max 4.000000 8.000000
df['one'][0]

1

企业中处理数据的方式

使用

1.别的同事会给你一个excel文件或csv文件
2.使用pandas读取csv文件

打开读取文件

movies = pd.read_csv('./douban_movie.csv')

文件操作处理

movies.index   # 查看文件信息

RangeIndex(start=0, stop=38735, step=1)

​ 获取索引名(表头)

movies.columns	

Index(['名字', '投票人数', '类型', '产地', '上映时间', '时长', '年代', '评分', '首映地点'], dtype='object')

修改表头

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

使用rename方法(推荐)
DataFrame.rename(mapper = None,index = None,columns = None,axis = None,copy = True,inplace = False,level = None )


mapper,index,columns:可以任选其一使用,可以是将index和columns结合使用。index和column直接传入mapper或者字典的形式。

df1.index = Series(['beijing', 'shanghai', 'guangzhou'])


home_info.columns = Series(['地址','结构','朝向','楼层','大小','户型','装修风格','总价/万','名称','单价_万/平方'])

获取数据

movies.values

获取数据的大概简介

movies.describe()    

数据另存为文件

movies.to_csv('./文件.csv',index=False)    # 添加 index = False  不添加索引到文件中
# 默认显示前5行  传入参数控制
movies.head()
# 默认显示后5行  传入参数控制
movies.tail()

高级操作之分组

read_html

相当于指定的爬虫,会获取网页中的所有的表格数据

# 读取某一url网页的下面的所有的表格数据
res = pd.read_html('https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192?fr=aladdin')
champion_res = res[0]  # 获取的是列表,直接取值获取第一个元素
champion_res
0 1 2 3 4 5
0 年份 比赛日期 冠军 总比分 亚军 FMVP
1 1947 4.16-4.22 费城勇士队 4-1 芝加哥牡鹿队
2 1948 4.10-4.21 巴尔的摩子弹队 4-2 费城勇士队
3 1949 4.4-4.13 明尼阿波利斯湖人队 4-2 华盛顿国会队
4 1950 4.8-4.23 明尼阿波利斯湖人队 4-2 塞拉库斯民族队
... ... ... ... ... ... ...
69 2015 6.5-6.17 金州勇士队 4-2 克里夫兰骑士队 安德烈·伊戈达拉
70 2016 6.3-6.20 克里夫兰骑士队 4-3 金州勇士队 勒布朗·詹姆斯
71 2017 6.2-6.13 金州勇士队 4-1 克利夫兰骑士队 凯文·杜兰特
72 2018 6.1-6.9 金州勇士队 4-0 克利夫兰骑士队 凯文·杜兰特
73 2019 5.31-6.14 多伦多猛龙队 4-2 金州勇士队 科怀·伦纳德

74 rows × 6 columns

改变

将第一行数据变为列名

champion_res.iloc[0]   # 获取第一行的数据

0 年份
1 比赛日期
2 冠军
3 总比分
4 亚军
5 FMVP
Name: 0, dtype: object

champion_res.columns = champion_res.iloc[0]    #直接赋值给列名
champion_res
年份 比赛日期 冠军 总比分 亚军 FMVP
0 年份 比赛日期 冠军 总比分 亚军 FMVP
1 1947 4.16-4.22 费城勇士队 4-1 芝加哥牡鹿队
2 1948 4.10-4.21 巴尔的摩子弹队 4-2 费城勇士队
3 1949 4.4-4.13 明尼阿波利斯湖人队 4-2 华盛顿国会队
4 1950 4.8-4.23 明尼阿波利斯湖人队 4-2 塞拉库斯民族队
... ... ... ... ... ... ...
69 2015 6.5-6.17 金州勇士队 4-2 克里夫兰骑士队 安德烈·伊戈达拉
70 2016 6.3-6.20 克里夫兰骑士队 4-3 金州勇士队 勒布朗·詹姆斯
71 2017 6.2-6.13 金州勇士队 4-1 克利夫兰骑士队 凯文·杜兰特
72 2018 6.1-6.9 金州勇士队 4-0 克利夫兰骑士队 凯文·杜兰特
73 2019 5.31-6.14 多伦多猛龙队 4-2 金州勇士队 科怀·伦纳德

74 rows × 6 columns

删除

2.需要将第一行数据删除

champion_res.drop([0],inplace=True)    # 删除多行或一行,inplace=True直接原对象删除
champion_res
年份 比赛日期 冠军 总比分 亚军 FMVP
1 1947 4.16-4.22 费城勇士队 4-1 芝加哥牡鹿队
2 1948 4.10-4.21 巴尔的摩子弹队 4-2 费城勇士队
3 1949 4.4-4.13 明尼阿波利斯湖人队 4-2 华盛顿国会队
4 1950 4.8-4.23 明尼阿波利斯湖人队 4-2 塞拉库斯民族队
5 1951 4.7-4.21 罗切斯特皇家队 4-3 纽约尼克斯队
... ... ... ... ... ... ...
69 2015 6.5-6.17 金州勇士队 4-2 克里夫兰骑士队 安德烈·伊戈达拉
70 2016 6.3-6.20 克里夫兰骑士队 4-3 金州勇士队 勒布朗·詹姆斯
71 2017 6.2-6.13 金州勇士队 4-1 克利夫兰骑士队 凯文·杜兰特
72 2018 6.1-6.9 金州勇士队 4-0 克利夫兰骑士队 凯文·杜兰特
73 2019 5.31-6.14 多伦多猛龙队 4-2 金州勇士队 科怀·伦纳德

73 rows × 6 columns

1.每个队获取冠军的次数

查询

# 对冠军球队进行分组   MySQL :  group by 分组对象
champion_res.groupby('冠军').groups

{'休斯顿火箭队': Int64Index([48, 49], dtype='int64'),
'克里夫兰骑士队': Int64Index([70], dtype='int64'),
'华盛顿子弹队': Int64Index([32], dtype='int64'),
'圣安东尼奥马刺队': Int64Index([53, 57, 59, 61, 68], dtype='int64'),
'圣路易斯老鹰队': Int64Index([12], dtype='int64'),
'塞拉库斯民族队': Int64Index([9], dtype='int64'),
'多伦多猛龙队': Int64Index([73], dtype='int64'),
'密尔沃基雄鹿队': Int64Index([25], dtype='int64'),
'巴尔的摩子弹队': Int64Index([2], dtype='int64'),
'底特律活塞队': Int64Index([43, 44, 58], dtype='int64'),
'明尼阿波利斯湖人队': Int64Index([3, 4, 6, 7, 8], dtype='int64'),
'波士顿凯尔特人队': Int64Index([11, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 28, 30, 35, 38, 40,
62],
dtype='int64'),
'波特兰开拓者队': Int64Index([31], dtype='int64'),
'洛杉矶湖人队': Int64Index([26, 34, 36, 39, 41, 42, 54, 55, 56, 63, 64], dtype='int64'),
'纽约尼克斯队': Int64Index([24, 27], dtype='int64'),
'罗切斯特皇家队': Int64Index([5], dtype='int64'),
'芝加哥公牛队': Int64Index([45, 46, 47, 50, 51, 52], dtype='int64'),
'西雅图超音速队': Int64Index([33], dtype='int64'),
'费城76人队': Int64Index([21, 37], dtype='int64'),
'费城勇士队': Int64Index([1, 10], dtype='int64'),
'达拉斯小牛队': Int64Index([65], dtype='int64'),
'迈阿密热火队': Int64Index([60, 66, 67], dtype='int64'),
'金州勇士队': Int64Index([29, 69, 71, 72], dtype='int64')}

聚合

对数据进行聚合

champion_res.groupby('冠军').size()

冠军
休斯顿火箭队 2
克里夫兰骑士队 1
华盛顿子弹队 1
圣安东尼奥马刺队 5
圣路易斯老鹰队 1
塞拉库斯民族队 1
多伦多猛龙队 1
密尔沃基雄鹿队 1
巴尔的摩子弹队 1
底特律活塞队 3
明尼阿波利斯湖人队 5
波士顿凯尔特人队 17
波特兰开拓者队 1
洛杉矶湖人队 11
纽约尼克斯队 2
罗切斯特皇家队 1
芝加哥公牛队 6
西雅图超音速队 1
费城76人队 2
费城勇士队 2
达拉斯小牛队 1
迈阿密热火队 3
金州勇士队 4
dtype: int64

排序

champion_res.groupby('冠军').size().sort_values(ascending=False)   # 默认是升序排列

冠军
波士顿凯尔特人队 17
洛杉矶湖人队 11
芝加哥公牛队 6
圣安东尼奥马刺队 5
明尼阿波利斯湖人队 5
金州勇士队 4
迈阿密热火队 3
底特律活塞队 3
休斯顿火箭队 2
纽约尼克斯队 2
费城76人队 2
费城勇士队 2
塞拉库斯民族队 1
克里夫兰骑士队 1
华盛顿子弹队 1
达拉斯小牛队 1
圣路易斯老鹰队 1
西雅图超音速队 1
多伦多猛龙队 1
密尔沃基雄鹿队 1
罗切斯特皇家队 1
波特兰开拓者队 1
巴尔的摩子弹队 1
dtype: int64

matolotlib

Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。

导入

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

使用

x = [5,7,2,10]
plt.plot(x)   # 画折线图,传入一个值得话,这个值就是y轴
plt.show()
x = [5,7,2,10]
y = [12,2,4,20]

# 更改画布大小
plt.figure(figsize=(10,6))   



# 添加说明
plt.title('这是一个标图说明',fontsize=20,color='blue')   # 标题
plt.xlabel('x',fontsize=15,color='red')   # x轴的说明
plt.ylabel('y',fontsize=20,color='red')   # y轴的说明


plt.plot(x,y)   
plt.show()

中文显示

Matplotlib 默认情况不支持中文,我们可以使用以下简单的方法来解决:

首先下载字体(注意系统):https://www.fontpalace.com/font-details/SimHei/

posted @ 2020-04-19 22:27  fwzzz  阅读(143)  评论(0)    收藏  举报