读取当前目录下 某招聘网站数据.csv 文件
读取当前目录下 TOP250.xlsx 文件
注意:使用 pandas 读取 CSV 与 读取 xlsx 格式的 Excel 文件方法大致相同
因此接下来与 Excel 相关的操作均以 CSV 格式进行出题。
import pandas as pd
data = pd.read_csv("某招聘网站数据.csv")
data = pd.read_excel("TOP250.xlsx")
2 读取 Excel 文件|指定位置
在大多数情况下,我们会将 notebook 和数据源文件放在同一个目录(文件夹下),这样直接使用pd.read_xxx("文件名")即可成功读取。
但有时需要读取的文件和 notebook 不在同一个目录下,这时可以使用绝对路径或者相对本 notebook 的路径。
现在请读取本套习题中第二章节下的数据,即 2 - 个性化显示设置/data.csv
data = pd.read_csv("../2 - 个性化显示设置/data.csv")
3 读取 Excel 文件|指定行(顺序)
读取当前目录下 某招聘网站数据.csv 文件的 前20行
data = pd.read_csv("某招聘网站数据.csv",nrows = 20)
4 读取 Excel 文件|指定行(跳过)
读取当前目录下 某招聘网站数据.csv 文件并跳过前20行
data = pd.read_csv("某招聘网站数据.csv",skiprows = [i for i in range(1,21)])
5 读取 Excel 文件|指定行(条件)
读取当前目录下 某招聘网站数据.csv 文件中全部偶数行
思考:如果是读取全部奇数行,或者更多满足指定条件的行呢?
data = pd.read_csv('某招聘网站数据.csv', skiprows=lambda x: (x != 0) and not x % 2)
# data = pd.read_csv('某招聘网站数据.csv', skiprows=lambda x: x % 2) 奇数行
6 读取 Excel 文件|指定列(列号)
根据指定列号读取
读取当前目录下 某招聘网站数据.csv 文件的第 1、3、5 列
data = pd.read_csv("某招聘网站数据.csv",usecols = [0,2,4])
7 读取 Excel 文件|指定列(列名)
根据指定列名读取
读取当前目录下 某招聘网站数据.csv 文件的 positionId、positionName、salary 列
data = pd.read_csv("某招聘网站数据.csv",usecols = ['positionId','positionName','salary'])
8 读取 Excel 文件|指定列(匹配)
根据指定列名匹配读取
让我们来个更难一点的,还是读取 某招聘网站数据.csv 文件,但现在有一个 list 中包含多个字段
usecols = ['positionId','test','positionName', 'test1','salary']
如果 usecols 中的列名存在于 某招聘网站数据.csv 中,则读取。
usecols = ['positionId', 'test', 'positionName', 'test1', 'salary']
data = pd.read_csv('某招聘网站数据.csv', usecols=lambda c: c in set(usecols))
9 读取 Excel 文件|指定索引
读取当前目录下 某招聘网站数据.csv 文件,并在读取时将 positionId 设置为索引列
data = pd.read_csv('某招聘网站数据.csv',index_col=['positionId'])
10 读取 Excel 文件|指定标题
读取当前目录下 某招聘网站数据.csv 文件的 positionId、positionName、salary 列,并将标题设置为 ID、岗位名称、薪资
data = pd.read_csv('某招聘网站数据.csv', usecols=[0,1,17],header = 0,names=['ID','岗位名称','薪资'])
11 读取 Excel 文件|缺失值转换
读取当前目录下 某招聘网站数据.csv 文件,并不将缺失值标记为 NA
data = pd.read_csv('某招聘网站数据.csv', keep_default_na=False)
12 读取 Excel 文件|缺失值标记
读取当前目录下 某招聘网站数据.csv 文件,并将[]标记为缺失值
data = pd.read_csv('某招聘网站数据.csv',na_values=['[]'])
13 读取 Excel 文件|忽略缺失值
读取当前目录下 某招聘网站数据.csv 文件,但不处理缺失值
data = pd.read_csv("某招聘网站数据.csv",na_filter=False)
14 读取 Excel 文件|指定格式
读取当前目录下 某招聘网站数据.csv 文件,并将 positionId,companyId 设置为字符串格式
data = pd.read_csv("某招聘网站数据.csv", dtype={'positionId': str,'companyId':str})
15 读取 Excel 文件|指定格式(时间)
读取当前目录下 某招聘网站数据.csv 文件,并将 createTime 列设置为字符串格式
data = pd.read_csv("某招聘网站数据.csv",parse_dates=['createTime'])
16 读取 Excel 文件|分块读取
读取当前目录下 某招聘网站数据.csv 文件,要求返回一个可迭代对象,每次读取 10 行
data = pd.read_csv("某招聘网站数据.csv", chunksize= 10)
17 读取 txt 文件|常规
读取当前目录下 Titanic.txt 文件。
注意:在接下来的几种格式文件读取中,对于之前重复的参数/功能将不再整理,仅介绍读取功能。
data = pd.read_table("Titanic.txt")
18 读取 txt 文件|含中文
读取当前目录下 TOP250.txt 文件。
data = pd.read_table("TOP250.txt",encoding='gb18030')
# data = pd.read_csv("TOP250.txt",encoding='gb18030',sep = 't') # 使用 read_csv 也可
19 读取 JSON 文件
读取当前目录下 某基金数据.json 文件。
data = pd.read_json("某基金数据.json")
20 读取 HDF5 文件
HDF5是一种特殊的文件格式,常见于在大规模存储数据上
关于 pandas 与 hdf5 格式文件的操作较多,下面仅学习如何读取。
读取当前目录下store_tl.h5文件
data = pd.read_hdf("store_tl.h5", "table")
21 从剪贴板读取数据
打开当前目录下 Titanic.txt 文件,全选并复制。
现在直接从剪贴板读取数据。
data = pd.read_clipboard()22 从 SQL 读取数据
有时我们需要从 SQL 中读取数据,如果先将数据导出再pandas读取并不是一个合适的选择。
在 pandas 中支持直接从 sql 中查询并读取。
为了方便统一操作,请先执行下面的代码创建数据。
pd.read_sql('SELECt int_column, date_column FROM test_data', conn)
#下面将 `SQL` 语句 `SELECt int_column, date_column FROM test_data` 转换为 `Dataframe`
23 从网页读取数据
直接从东京奥运会官网读取奖牌榜数据。
目标网站地址为 https://olympics.com/tokyo-2020/olympic-games/zh/results/all-sports/medal-standings.htm
data = pd.read_html("https://olympics.com/tokyo-2020/olympic-games/zh/results/all-sports/medal-standings.htm")[0]
24 循环读取数据
在本小节 demodata 文件夹下有多个 Excel 文件,要求一次性循环读取全部文件
import os
path = 'demodata/'
filesnames = os.listdir(path)
filesnames = [f for f in filesnames if f.lower().endswith(".xlsx")]
df_list = []
for filename in filesnames:
df_list.append(pd.read_excel(path + filename))
df = pd.concat(df_list)
1-2 数据创建
除了直接读取本地文件,学会直接创建数据框也很重要,常见于测试一些函数,下面是从常见数据结构创建数据框的方法整理
25 从列表创建将下面的 list 转换为 dataframe,并指定列名为"早起Python"
l = [1,2,3,4,5] data = pd.Dataframe(l,columns=['早起Python'])26 从列表创建|嵌套列表
将下面的 list 转换为 dataframe,并指定行索引为"公众号","早起Python"
l = [[1,2,3],[4,5,6]] data = pd.Dataframe(l,index=['公众号','早起Python'])27 从字典创建
d = {
"one": pd.Series([1.0, 2.0, 3.0], index=["a", "b", "c"]),
"two": pd.Series([1.0, 2.0, 3.0, 4.0], index=["a", "b", "c", "d"]) }
data = pd.Dataframe(d)
28 从字典创建|指定索引
还是上一题的字典d,将其转换为dataframe并指定索引顺序为 d、b、a
data = pd.Dataframe(d, index=["d", "b", "a"])29 从字典创建|指定列名
还是上一题的字典d,将其转换为dataframe并指定索引顺序为 d、b、a,列名为"two", "three"
data = pd.Dataframe(d, index=["d", "b", "a"], columns=["two", "three"])30 从字典创建|字典列表
将下方列表型字典转换为dataframe
思考:如何指定行/列索引?
d = [{"a": 1, "b": 2}, {"a": 5, "b": 10, "c": 20}]
data = pd.Dataframe(data2)
31 从集合创建
将下面的元组转换为 dataframe 且行列索引均为 1,2,3,4
t =((1,0,0,0,),(2,3,0,0,),(4,5,6,0,),(7,8,9,10,)) data = pd.Dataframe(t, columns=[1,2,3,4], index=[1,2,3,4])1-3 数据存储 32 保存为 CSV
将第三题读取到的数据保存为 csv 格式至当前目录下(文件名任意)
data.to_csv("out.csv",encoding = 'utf_8_sig')
33 保存为 CSV|指定列
将第三题读取到的数据保存为 csv 格式至当前目录下(文件名任意),且只保留positionName、salary两列
data.to_csv("out.csv",encoding = 'utf_8_sig',columns=['positionName','salary'])
34 保存为 CSV|取消索引
将第三题读取到的数据保存为 csv 格式至当前目录下(文件名任意),且取消每一行的索引
data.to_csv("out.csv",encoding = 'utf_8_sig',index = False)
35 保存为 CSV|标记缺失值
在上一题的基础上,在保存的同时,将缺失值标记为'数据缺失'
data.to_csv("out.csv",encoding = 'utf_8_sig',index = False,na_rep = '数据缺失')
36 保存为CSV|压缩
将上一题的数据保存至 zip 文件,解压后出现 out.csv
compression_opts = dict(method='zip',
archive_name='out.csv')
data.to_csv('out.zip', index=False,
compression=compression_opts)
37 保存为 Excel
将第三题读取到的数据保存为 xlsx 格式至当前目录下(文件名任意)
data.to_excel("test.xlsx")
38 保存为 JSON
将之前的数据保存为 json 格式至当前目录下(文件名任意)
data.to_json("out.json")
39 保存为 Markdown
将之前数据转换为 markdown 形式表格,这样可以直接复制进 .md 文件中使用
data.head().to_markdown(index = None)40 保存为 Html
将之前的数据保存为 html 格式至当前目录下(文件名任意),并进行如下设置
取消行索引标题居中对齐列宽100
data.to_html("out.html", col_space=100,index = None,justify = 'center',border = 1)
2 - pandas 个性化显示设置
2-1 基于 option 修改显示设置
在 pandas 中有一个 option 系统,可以通过 set_option方法进行进阶显示选项设置。
本小节主要整理了一些基于 option 修改数据显示的设置。
注意【基于 option 修改显示设置】并未修改数据,仅是在原有数据基础上优化显示状态,随时可以通过重置选项重置全部设置,恢复数据默认显示状态。
1 显示全部列如下图所示,直接查看 data 会发现,由于数据维度较大,部分行列会被折叠,显示为...,现在需要显示全部的列方便预览。
pd.set_option('display.max_columns', None) #显示全部列
# pd.set_option('display.max_rows', None) # 显示全部行
2 显示指定行/列
指定让 data 在预览时显示10列,7行
pd.set_option('display.max_columns', 10)
pd.set_option('display.max_rows', 7)
3 还原行/列显示数
还原上面的显示设置
pd.reset_option("max_rows")
pd.reset_option("max_columns")
4 修改每列最大字符宽度
即每列最多显示的字符长度,例如【每列最多显示10个字符,多余的会变成...】
pd.set_option ('display.max_colwidth',10)
5 修改小数点精度
修改默认显示精度为小数点后5位
pd.set_option('precision', 5)
6 还原所有显示设置
还原上面的全部显示设置
pd.reset_option("^display")
2-2 更多 option 相关设置
7 忽略警告
取消pandas相关warning提示
pd.set_option("mode.chained_assignment", None)
# 全局取消warning
# import warnings
# warnings.filterwarnings('ignore')
8 设置数值显示条件
如果数值小于 20 则显示为0
pd.set_option('chop_threshold', 20)
9 让 pandas 支持 LaTex
让dataframe中内容支持 Latex 显示(需要使用$$包住)
pd.set_option("display.html.use_mathjax",True)
10 修改默认绘图引擎
修改pandas默认绘图引擎为plotly(需要提前安装好plotly)
pd.set_option("plotting.backend","plotly")
11 还原所有 option 设置
还原上面全部 option 设置
pd.reset_option("all")
彩蛋
如何设置在预览数据时,不换行显示每列内容?
2-3 基于 style 个性化设置上面基于 option 的 pandas 相关设置是全局配置,一次设置会在关闭notebook前一直有效
但相关常用的设置并不多,不能满足更多的个性化需求。
幸运的是在 pandas 中提供 Styler 对象让我们进一步个性化展示数据。
本节我就将一些常用的基于 style 个性化设置整理为习题模式方便大家学习、巩固。
注意:基于 style 个性化设置同样不会修改数据,所有 data.style.xxxx 输出的数据均是一次性的(可以复用、导出),因此你应该在合适的时间选择使用该方法。
下面仅列举常用的方法,若想了解更多可以查阅pandas官方文档对应文章
为了方便理解,重新读取data.csv前20行指定列
'positionName''createTime'(设置为时间格式)'salary''subwayline''matchScore'
data = pd.read_csv("data.csv", usecols=[
'positionName', 'createTime', 'salary', 'subwayline', 'matchScore'], nrows=20, parse_dates=['createTime'])
12 隐藏索引
隐藏索引列
data.style.hide_index()13 调整精度
将带有小数点的列精度调整为小数点后2位
data.style.set_precision(2)14 标记缺失值
(data
.style
.set_na_rep("数据缺失"))
15 高亮缺失值
将缺失值高亮,颜色名skyblue
(data
.style
.set_na_rep("数据缺失")
.highlight_null(null_color='skyblue'))
16 高亮数值列最大值
将 数值格式列的最大值进行高亮
data.style.highlight_max()17 高亮数值列最小值
将 数值格式列的最小值进行高亮
data.style.highlight_min()18 同时高亮最大最小值
同时高亮最大值(颜色代码为#F77802)与最小值(颜色代码为#26BE49)
(data .style .highlight_max(color='#F77802') .highlight_min(color='#26BE49'))19 指定格式高亮
高亮 salary 列范围在 3000 - 10000 的数值
(data .style .highlight_between(left=3000, right=10000, subset=['salary']))20 渐变显示数值列
将数值格式的列使用渐变色(绿色)进行显示,以突出趋势
import seaborn as sns
cm = sns.light_palette("green", as_cmap=True)
(data
.style
.background_gradient(cmap=cm))
21 修改字体颜色
将 salary 列修改为红色字体
(data
.style
.set_properties(
subset=['salary'], **{'color': 'red'}))
22 修改背景颜色、对齐方式、字体大小
将整个 dataframe 进行如下设置:
居中背景色修改为 #F8F8FF字体:13px
(data
.style
.set_properties(**{'background-color': '#F8F8FF','text-align':'center', 'font-size': '13px'}))
23 综合(链式)设置
除了上面的单个设置,还可以将多个设置进行结合,下面对整个 dataframe 进行如下设置:
居中背景色修改为 #F8F8FF字体:13px
并将 salary 列字体修改为红色
(data
.style
.set_properties(**{'background-color': '#F8F8FF','text-align':'center', 'font-size': '13px'})
.set_properties(
subset=['salary'], **{'color': 'red'}))
24 导出样式
将上一题带有样式的 pandas 数据框导出为本地 Excel(.xlsx格式)
(data
.style
.set_properties(**{'background-color': '#F8F8FF','text-align':'center', 'font-size': '13px'})
.set_properties(
subset=['salary'], **{'color': 'red'})).to_excel('带有样式导出.xlsx')
25 制作指定列条形图
在 pandas 中对 salary 列使用条形图进行可视化,指定颜色skyblue
(data .style .bar(subset=['salary'],color='skyblue'))26 带有条件的样式(自定义样式)
将 salary 列数值大于 30000 的单元格字体修改为红色
def my_style(val):
color = 'red' if val > 30000 else 'black'
return 'color: %s' % color
data.style.applymap(my_style, subset="salary")
27 格式化输出日期类型
将 createTime 列格式化输出为 xx年xx月xx日
链接
28 指定(自定义)格式化数据在 salary 列后增加"元"对 matchScore 列保留两位小数并增加"分"
(data
.style
.format("{0:,.2f}分", subset="matchScore")
.format("{""}元", subset="salary"))
3 - 数据预览与预处理
数据查看
1 - 查看数据维度
先看看数据多少行,多少列,对接下来的处理量心里有个数
df.shape2 - 随机查看5条数据
df.sample(5)3 - 查看数据前后5行
df.head() # df.tail() # 查看后5行4 - 查看数据基本信息
看看数据类型,有无缺失值什么的
df.info()5 - 查看数据统计信息|数值
查看 数值型 列的统计信息,计数、均值什么的
df.describe() # df.describe().round(2).T 一般我会这样用6 - 查看数据统计信息|离散
查看 离散型 列的统计信息,计数、频率什么
df.describe(include=['O'])7 - 查看数据统计信息|整体
查看 全部 列的统计信息
df.describe(include='all')缺失值处理 8 - 计算缺失值|总计
df.isna().sum().sum()9 - 计算缺失值|分列
再看看具体每列有多少缺失值
df.isnull().sum()10 - 查看缺失值
为了后面更方便的处理缺失值,现在先看看全部缺失值所在的行
df[df.isnull().T.any() == True]11 - 删除缺失值
处理缺失值最简单的方式,当然是将缺失值出现的行全部删掉~
-> 现在,将缺失值出现的行全部删掉
df = df.dropna()12 - 缺失值补全|整体填充
除了删除缺失值最省事之外,将全部缺失值替换为一个 固定的值/文本 也是一个较为省事的方法’
-> 现在,将全部缺失值替换为 *
df = df.fillna('*')
13 - 缺失值补全|向上填充
df['评分'] = df['评分'].fillna(axis=0,method='ffill')14 - 缺失值补全|整列均值填充
df['评价人数'] = df['评价人数'].fillna(df['评价人数'].mean())15 - 缺失值补全|缺失值上下均值填充
df['评价人数'] = df['评价人数'].fillna(df['评价人数'].interpolate())16 -缺失值补全|匹配填充
除了利用均值填充,有时还需要根据另一列的值进行匹配填充
-> 现在填充 “语言” 列的缺失值,要求根据 “国家/地区” 列的值进行填充
例如 《海上钢琴师》国家/地区为 意大利,根据其他意大利国家对应的语言来看,应填充为 意大利语
注意:此题会有多种解法
df['语言']=df.groupby('国家/地区').语言.bfill()
重复值处理
17 - 查找重复值
将全部重复值所在的行筛选出来
注意:此题会有多种解法
df[df.duplicated()]18 -查找重复值|指定
上面是所有列完全重复的情况,但有时我们只需要根据某列查找重复值
-> 查找 片名 列全部重复值
注意:此题会有多种解法
df[df.duplicated(['片名'])]19 - 删除全部重复值
df = df.drop_duplicates()20 - 删除重复值|指定
df = df.drop_duplicates(keep = 'last')4 - 数据统计描述性分析 数据探索 1 - 修改索引
-> 修改索引为 学校名称 列
df.set_index("学校名称",inplace= True)
2 - 查看数据量
也就是数据框的 行 * 列,总共单元格的数量
df.size3 - 数据排序
将数据按照总分升序排列,并展示前20个学校
备注:也就是看倒数20名啦
df.sort_values(by='总分', ascending=True).head(20)4 - 数据排序
将数据按照 高端人才得分 降序排序,展示前 10 位
df.nlargest(10, '高端人才得分')5 - 分列排名
查看各项得分最高的学校名称
df.iloc[:,3:].idxmax()6 - 统计信息|均值
计算总分列的均值
df.总分.mean()7 - 统计信息|中位数
计算总分列的中位数
df.总分.median()8 - 统计信息|众数
计算总分列的众数
df.总分.mode()9 -统计信息|部分
计算 总分、高端人才得分、办学层次得分的最大最小值、中位数、均值
df.agg({
"总分": ["min", "max", "median", "mean"],
"高端人才得分": ["min", "max", "median", "mean"],
"办学层次得分":["min", "max", "median", "mean"]})
10 - 统计信息|完整
查看数值型数据的统计信息(均值、分位数等),并保留两位小数
df.describe().round(2).T11 - 统计信息|分组
计算各省市总分均值
df.groupby("省市")['总分'].mean()
12 - 统计信息|相关系数
也就是相关系数矩阵,也就是每两列之间的相关性系数
df.corr()13 - 相关系数|热力图
### 方法一 ### df.corr().style.background_gradient(cmap='coolwarm').set_precision(2) ### 方法二 ### 借助 `matplotlib` 和 `seaborn` 其中中文设置可以参考我的这篇文章 https://mp.weixin.qq.com/s/WKOGvQP-6QUAP00ZXjhweg import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize = (9,6),dpi=100) sns.set(font='Songti SC') sns.heatmap(df.corr().round(2),annot=True,cmap='RdBu') plt.show()14 - 统计信息|频率
计算各省市出现的次数
df.省市.value_counts()15 - 统计信息|热力地图
from pyecharts import options as opts
from pyecharts.charts import Map
list1 = list(pd.Dataframe(df.省市.value_counts()).index)
list2 = list(pd.Dataframe(df.省市.value_counts()).省市)
c = (
Map()
.add('', [list(z) for z in zip(list1,list2)], "china",is_map_symbol_show=False)
.set_global_opts(
title_opts=opts.TitleOpts(title="排名前100高校各省市占比"),
visualmap_opts=opts.VisualMapOpts(max_=20),
)
)
c.render_notebook()
16 - 统计信息|直方图
绘制总分的直方图、密度估计图
import seaborn as sns sns.set(font='Songti SC') sns.distplot(df['总分'])5 - 数据筛选与修改 1- 数据修改|列名
将原 df 列名 Unnamed: 2、Unnamed: 3、Unnamed: 4 修改为 金牌数、银牌数、铜牌数
df.rename(columns={'Unnamed: 2':'金牌数',
'Unnamed: 3':'银牌数',
'Unnamed: 4':'铜牌数'},inplace=True)
2 - 数据修改|行索引
将第一列(排名)设置为索引
df.set_index("排名",inplace=True)
3 - 数据修改|修改索引名
修改索引名为 金牌排名
df.rename_axis("金牌排名",inplace=True)
4 - 数据修改|修改值
将 ROC(第一列第五行)修改为 俄奥委会
df.iloc[4,0] = '俄奥委会'5 - 数据修改|替换值(单值)
将金牌数列的数字 0 替换为 无
df['金牌数'].replace(0,'无',inplace=True)5 - 数据修改|替换值(单值)
将金牌数列的数字 0 替换为 无
df['金牌数'].replace(0,'无',inplace=True)6 - 数据修改|替换值(多值)
同时替换
将 无 替换为 缺失值将 0 替换为 None
注意:缺失值的 Nan 该怎么生成?
import numpy as np df.replace(['无',0],[np.nan,'None'],inplace = True)7 - 数据查看
查看各列数据类型
df.dtypes8 - 数据修改|修改类型
将 金牌数 列类型修改为 int
df['金牌数'] = df['金牌数'].fillna('0').astype(int)
9 - 数据增加|新增列(固定值)
重新加载数据 并 新增一列 比赛地点,值为 东京
df['比赛地点'] = '东京'10 - 数据增加|新增列(计算值)
新增一列 金银牌总数列,值为该国家金银牌总数
df = df.replace('None',0)
df['金银牌总数'] = df['金牌数'] + df['银牌数']
11 - 数据增加|新增列(比较值)
新增一列 最多奖牌数量 列,值为该国 金、银、铜 牌数量中最多的一个奖牌数量
例如美国银牌最多,则为41,中国为38
df['最多奖牌数量'] = df.bfill(1)[["金牌数", "银牌数",'铜牌数']].max(1)12 - 数据增加|新增列(判断值)
新增一列 金牌大于30
如果一个国家的金牌数大于 30 则值为 是,反之为 否
df['金牌大于30'] = np.where(df['金牌数'] > 30, '是', '否')13 - 数据增加|增加多列
新增两列,分别是
金铜牌总数(金牌数+铜牌数)银铜牌总数(银牌数+铜牌数)
df = df.assign(金铜牌总数=df.金牌数 + df.铜牌数,
银铜牌总数=df.银牌数+df.铜牌数)
14 - 数据增加|新增列(引用变量)
新增一列金牌占比,为各国金牌数除以总金牌数(gold_sum)
gold_sum = df['金牌数'].sum()
df.eval(f'金牌占比 = 金牌数 / {gold_sum}',inplace=True)
15 - 数据增加|新增行(末尾追加)
在 df 末尾追加一行,内容为 0,1,2,3… 一直到 df 的列长度
df1 = pd.Dataframe([[i for i in range(len(df.columns))]], columns=df.columns) df_new = df.append(df1)16 - 数据增加|新增行(指定位置)
在第 2 行新增一行数据,即美国和中国之间。
数据内容同上一题
df1 = df.iloc[:1, :] df2 = df.iloc[1:, :] df3 = pd.Dataframe([[i for i in range(len(df.columns))]], columns=df.columns) df_new = pd.concat([df1, df3, df2], ignore_index=True)17 - 数据删除|删除行
删除 df 第一行
df.drop(1)18 - 数据删除|删除行(条件)
df.drop(df[df.金牌数<20].index)19 - 数据删除|删除列
删除刚刚新增的 比赛地点 列
df.drop(columns=['比赛地点'],inplace=True)20 - 数据删除|删除列(按列号)
删除 df 的 7、8、9、10 列
df.drop(df.columns[[7,8,9,10]], axis=1,inplace=True)5-2 数据筛选
以下所有答案要求返回的是一个 dataframe 而不是 Series 这样可以直接存储为 Excel 等格式的文件!
21 - 筛选列|通过列号提取第 1、2、3、4 列
df.iloc[:,[0,1,2,3]]22 - 筛选列|通过列名
提取 金牌数、银牌数、铜牌数 三列
df[['金牌数','银牌数','铜牌数']]23 - 筛选列|条件(列号)
筛选全部 奇数列
df.iloc[:,[i%2==1 for i in range(len(df.columns))]]24 - 筛选列|条件(列名)
提取全部列名中以 “数” 结尾的列
df.loc[:, df.columns.str.endswith('数')]
25 - 筛选列|组合(行号+列名)
提取倒数后三列的10-20行
df.loc[10:20, '总分':]26 - 筛选行|通过行号
提取第 10 行
df.loc[9:9]27 - 筛选行|通过行号(多行)
提取第 10 行之后的全部行
df.loc[9:]28 - 筛选行|固定间隔
提取 0-50 行,间隔为 3
df[:50:3]29 - 筛选行|判断(大于)
提取 金牌数 大于 30 的行
df[df['金牌数'] > 30]30 - 筛选行 |判断(等于)
提取 金牌数 等于 10 的行
df.loc[df['金牌数'] == 10]31 - 筛选行|判断(不等于)
提取 金牌数 不等于 10 的行
df.loc[~(df['金牌数'] == 10)]32 - 筛选行|条件(指定行号)
提取全部 奇数行
df[[i%2==1 for i in range(len(df.index))]]33 - 筛选行|条件(指定值)
提取 中国、美国、英国、日本、巴西 五行数据
df.loc[df['国家奥委会'].isin(['中国','美国','英国','日本','巴西'])]34 - 筛选行|多条件
在上一题的条件下,新增一个条件:金牌数小于30
df.loc[(df['金牌数'] < 30) & (df['国家奥委会'].isin(['中国','美国','英国','日本','巴西']))]35 - 筛选行|条件(包含指定值)
提取 国家奥委会 列中,所有包含 国的行
df[df.国家奥委会.str.contains('国')]
36 - 筛选某行某列
提取 第 0 行第 2 列
df.iloc[0:1,[1]]37 - 筛选多行多列
提取 第 0-2 行第 0-2 列
df.iloc[0:2,[0,1]]38 - 筛选值|组合(行号+列号)
提取第 4 行,第 4 列的值
df.iloc[3,3]39 - 筛选值|组合(行号+列名)
提取行索引为 4 ,列名为 金牌数 的值
df.at[4,'金牌数']40 - 筛选值|条件
提取 国家奥委会 为 中国 的金牌数
df.loc[df['国家奥委会'] == '中国'].loc[1].at['金牌数']41 - 筛选值|query
方式1:使用df[ (df[‘a’]>3) & (df[‘b’]<5) ]
方式2:使用 df.query(‘a’>3 and ‘b’<5)
数据量大使用方法2
使用 query 提取 金牌数 + 银牌数 大于 15 的国家
df.query('金牌数+银牌数 > 15')
42 - 筛选值|query(引用变量)
使用 query 提取 金牌数 大于 金牌均值的国家
gold_mean = df['金牌数'].mean()
df.query(f'金牌数 > {gold_mean}')
6 - 数据分组与聚合
分组
1 - 分组统计|均值
计算各区(district)的薪资(salary)均值
df[['district','salary']].groupby(by='district').mean()2 - 分组统计|取消索引
重新按照上一题要求进行分组,但不使用 district 做为索引
df.groupby("district", as_index=False)['salary'].mean()
3 - 分组统计|排序
计算并提取平均薪资最高的区
df[['district','salary']].groupby(by='district').mean().sort_values('salary',ascending=False).head(1)
4 - 分组统计|频率
计算不同行政区(district),不同规模公司(companySize)出现的次数
pd.Dataframe(df.groupby("district")['companySize'].value_counts())
# df.groupby(['district','companySize']).size()
5 - 分组统计|修改索引名
将上一题的索引名修改为
district -> 行政区companySize -> 公司规模
pd.Dataframe(df.groupby("district")['companySize'].value_counts()).rename_axis(["行政区", "公司规模"])
6 - 分组统计|计数
计算上一题,每个区出现的公司数量
df.groupby("district")['companySize'].count()
7 - 分组查看|全部
将数据按照 district、salary 进行分组,并查看各分组内容
df.groupby(["district",'salary']).groups8 - 分组查看|指定
将数据按照 district、salary 进行分组,并查看西湖区薪资为 30000 的工作
df.groupby(["district",'salary']).get_group(("西湖区",30000))
9 - 分组规则|通过匿名函数1
根据 createTime 列,计算每天不同 行政区 新增的岗位数量
pd.Dataframe(df.groupby([df.createTime.apply(lambda x:x.day)])[
'district'].value_counts()).rename_axis(["发布日", "行政区"])
10 - 分组规则|通过匿名函数2
计算各行政区的企业领域(industryField)包含电商的总数
df.groupby("district", sort=False)["industryField"].apply(
lambda x: x.str.contains("电商").sum())
11 - 分组规则|通过内置函数
通过 positionName 的长度进行分组,并计算不同长度岗位名称的薪资均值
df.set_index("positionName").groupby(len)['salary'].mean()
12 - 分组规则|通过字典
将 score 和 matchScore 的和记为总分,与 salary 列同时进行分组,并查看结果
df.groupby({'salary':'薪资','score':'总分','matchScore':'总分'}, axis=1).sum()
13 - 分组规则|通过多列
计算不同 工作年限(workYear)和 学历(education)之间的薪资均值
pd.Dataframe(df['salary'].groupby([df['workYear'], df['education']]).mean())14 - 分组转换| transform
在原数据框 df 新增一列,数值为该区的平均薪资水平
df['该区平均工资'] = df[['district','salary']].groupby(by='district').transform('mean')
15 - 分组过滤|filter
提取平均工资小于 30000 的行政区的全部数据
df.groupby('district').filter(lambda x: x['salary'].mean() < 30000)
16 - 分组可视化
对杭州市各区公司数量进行分组,并使用柱状图进行可视化
import matplotlib.pyplot as plt
%config InlineBackend.figure_format = 'retina'
plt.rcParams['font.sans-serif'] = ['Songti SC']
df.groupby("district")['positionName'].count().plot(
kind='bar', figsize=(10, 6), color='#5172F0', fontsize=12)
plt.ylabel("公司数量",fontsize = 14)
plt.xlabel("杭州市各区",fontsize = 14)
plt.show()
聚合
17 - 聚合统计
分组计算不同行政区,薪水的最小值、最大值和平均值
import numpy as np
df.groupby('district')['salary'].agg([min, max, np.mean])
18 - 聚合统计|修改列名
将上一题的列名(包括索引名)修改为中文
df.groupby('district').agg(最低工资=('salary', 'min'), 最高工资=(
'salary', 'max'), 平均工资=('salary', 'mean')).rename_axis(["行政区"])
19 - 聚合统计|组合
对不同岗位(positionName)进行分组,并统计其薪水(salary)中位数和得分(score)均值
df.groupby('positionName').agg({'salary': np.median, 'score': np.mean})
20 -聚合统计|多层
对不同行政区进行分组,并统计薪水的均值、中位数、方差,以及得分的均值
df.groupby('district').agg(
{'salary': [np.mean, np.median, np.std], 'score': np.mean})
21 - 聚合统计|自定义函数
在 18 题基础上,在聚合计算时新增一列计算最大值与平均值的差值
def myfunc(x):
return x.max()-x.mean()
df.groupby('district').agg(最低工资=('salary', 'min'), 最高工资=(
'salary', 'max'), 平均工资=('salary', 'mean'), 最大值与均值差值=('salary', myfunc)).rename_axis(["行政区"])
7 - 数据透视与合并
数据透视表
1 - 数据透视|默认
制作各省「平均销售额」的数据透视表
pd.pivot_table(df,values = ['销售额'],index = '省/自治区')
# df.groupby("省/自治区")['销售额'].mean() 通过上一章分组
2 - 数据透视|指定方法
制作各省「销售总额」的数据透视表
pd.pivot_table(df,values = ['销售额'],index = '省/自治区',aggfunc = sum)3 - 数据透视|多方法
制作各省「销售总额」与「平均销售额」的数据透视表
pd.pivot_table(df,values = ['销售额'],index = '省/自治区',aggfunc = ['mean',sum])4 - 数据透视|多指标
制作各省市「销售总额」与「利润总额」的数据透视表
pd.pivot_table(df,values = ['销售额','利润','数量'],index = '类别',aggfunc = sum)5 - 数据透视|多索引
制作「各省市」与「不同类别」产品「销售总额」的数据透视表
pd.pivot_table(df,values = ['销售额'],index = ['省/自治区','类别'],aggfunc = sum)6 - 数据透视|多层
制作各省市「不同类别」产品的「销售总额」透视表
pd.pivot_table(df,values = ['销售额'],index = ['省/自治区'], columns='类别',aggfunc = sum)7 - 数据透视|综合
制作「各省市」、「不同类别」产品「销售量与销售额」的「均值与总和」的数据透视表,并在最后追加一行『合计』
pd.pivot_table(df,values = ['销售额','数量'],index = ['省/自治区','类别'],aggfunc = ['mean',sum],margins=True)8 - 数据透视|筛选
在上一题的基础上,查询 「类别」 等于 「办公用品」 的详情
table = pd.pivot_table(df,values = ['销售额','数量'],index = ['省/自治区','类别'],aggfunc = ['mean',sum],margins=True)
table.query('类别 == ["办公用品"]')
9 -数据透视|逆透视
逆透视就是将宽的表转换为长的表,例如将第 5 题的透视表进行逆透视,其中不需要转换的列为『数量』列
table = pd.pivot_table(df,values = ['销售额','利润','数量'],index = '类别',aggfunc = sum) table.melt(id_vars=['数量'],var_name='分类',value_name='金额')数据合并 concat - 数据拼接 10 - concat|默认拼接
拼接 df1 和 df2
pd.concat([df1, df2])11 - concat|拼接多个
垂直拼接 df1、df2、df3,效果如下图所示
pd.concat([df1, df2, df3])12 - concat|重置索引
垂直拼接 df1 和 df4,并按顺序重新生成索引,
pd.concat([df1, df4], ignore_index=True)13 - concat|横向拼接
横向拼接 df1、df4,效果如下图所示
pd.concat([df1,df4],axis=1)14 - concat|横向拼接(取交集)
在上一题的基础上,只取结果的交集
pd.concat([df1,df4],axis=1,join='inner')15 - concat|横向拼接(取指定)
在 14 题基础上,只取包含 df1 索引的部分
pd.concat([df1, df4], axis=1).reindex(df1.index)16 - concat|新增索引
拼接 df1、df2、df3,同时新增一个索引(x、y、z)来区分不同的表数据来源
pd.concat([df1, df2, df3], keys=['x', 'y', 'z'])merge - 数据连接 17 - merge|按单键
根据 key 连接 left 和 right
pd.merge(left, right, on='key')18 - merge|按多键
根据 key1 和 key2 连接 left 和 right
pd.merge(left, right, on=['key1', 'key2'])19 - merge|左外连接
如下图所示的结果连接 left 和 right,保留左表全部键
pd.merge(left, right, how='left', on=['key1', 'key2'])20 - merge|右外连接
如下图所示的结果连接 left 和 right,保留右表全部键
pd.merge(left, right, how='right', on=['key1', 'key2'])21 - merge|全外连接
如下图所示的结果连接 left 和 right,保留全部键
pd.merge(left, right, how='outer', on=['key1', 'key2'])22 - merge|内连接
如下图所示的结果连接 left 和 right,保留交集
pd.merge(left, right, how='inner', on=['key1', 'key2'])23 - merge|重复索引
重新产生数据并按下图所示进行连接
pd.merge(left, right, how='inner', on=['key1', 'key2'])join - 组合 24 - join|左对齐
合并 left 和 right,并按照 left 的索引进行对齐
left.join(right)25 - join|左对齐(外连接)
按下图所示进行连接
思考:merge 做法
left.join(right, how='outer') #pd.merge(left, right, left_index=True, right_index=True, how='outer')26 - join|左对齐(内连接)
按下图所示进行连接
left.join(right, how='inner') #pd.merge(left, right, left_index=True, right_index=True, how='inner')27 - join|按索引
重新产生数据并按下图所示进行连接(根据 key)
left.join(right, on='key')28 - join|按索引(多个)
重新产生数据并按下图所示进行连接(根据 key1 和 key2)
left.join(right, on=['key1', 'key2'])8 - 时间处理 8-1 pandas中的时间操作 1 - 时间生成|当前时间
使用 pandas 获取当前时间
pd.Timestamp('now')
2 - 时间生成|指定范围
使用 pandas 按天生成 2021年1月1日 至 2021年9月1日的全部日期
pd.date_range('1/1/2021','9/11/2021')
3 - 时间生成|指定长度
使用 pandas 从 2021年1月1日开始,按天生成 10 天日期
pd.date_range("2021-01-01", periods=10)
4 - 时间生成|指定频率
使用 pandas 从 2021年1月1日开始,按周生成 7 周日期
pd.date_range("2021-01-01", periods=7, freq="W")
5 - 时间生成|特殊规律
使用 pandas 按天生成 2021年1月1日 至 2021年9月1日的全部工作日日期
pd.bdate_range(start='1/1/2021', end='9/1/2021')6 - 时间计算|时间差(天)
使用 pandas 计算 2021年2月14日 距离今天相差多少天
(pd.Timestamp('now') - pd.to_datetime('2021-02-14')).days
7 - 时间计算|时间差(小时)
使用 pandas 计算 2021年9月1日13点14分 距离今天相差多少小时
import numpy as np
(pd.Timestamp('now') - pd.to_datetime('2021-09-01 13:14:00'))/np.timedelta64(1, 'h')
8 - 时间运算
将第一题得到的时间减去一天,并格式化为 xx年xx月xx日 xx时xx分xx秒
(pd.Timestamp('now') - pd.to_timedelta('1 day'))
9 - 时间格式化
将上一题的结果式化为 xx年xx月xx日-xx时xx分xx秒
(pd.Timestamp('now') - pd.to_timedelta('1 day')).strftime("%Y年%m月%d日-%H时%M分%S秒")
10 - 时间类型转换
将 df1 和 df2 的 日期 列转换为 pandas 支持的时间格式
df1['日期'] = pd.to_datetime(df1['日期'])
df2['时间'] = pd.to_datetime(df2['时间'])
# df1['日期'] = df1['日期'].astype('datetime64[ns]')
11 - 日期筛选|区间
筛选出 df2 时间在 2021-08-03 09:35:00 与 2021-08-04 15:00:00 之间的数据
df2[(df2['时间'] > '2021-08-03 09:35:00') & (df['时间'] < '2021-08-04 15:00:00')]12 - 日期筛选|指定
筛选 df2 时间为 2021-08-03 的全部数据
df2.set_index('时间').truncate(after=pd.Timestamp('2021-08-04'))
13 - 日期移动|值
将 df1 的索引设置为日期,将 df1 数据向后移动一天
df1.set_index('日期').shift(1)
14 - 日期移动|索引
将 df1 的索引设置为日期,并将全部日期向后移动一天
import datetime
df1.set_index('日期').shift(freq=datetime.timedelta(1))
15 - 日期重采样|日 -> 周
按周对 df1 进行重采样,保留每周最后一个数据
df1.set_index('日期').resample('W').last()
16 - 日期重采样|日 -> 月
按月对 df1 进行重采样,保留每月最后一个数据
df1.set_index('日期').resample('M').last()
17 - 日期重采样|分钟 -> 日
按日对 df2 进行重采样,保留每天最后一个数据
df2.set_index('时间').resample('D').last()
9 - 更多未提及的操作
9-1 map 与 applymap
pandas 中的 map 和 applymap 可以对指定列(map)或整个数据框(applymap)工作
1 - map|基本使用将 df1 第一列中的 A0 替换为 cat,A3 替换为 rabbit,其余为设置为NaN(缺失值)
df1['A'] = df1['A'].map({'A0':'cat','A3':'rabbit'})
2 - map|匿名函数
在上一题的结果上,将 df1 第 1 列中的字符末尾追加「Python」
df1['A'] = df1['A'].map(lambda x:f'{x} Python')
3 - map|跳过缺失值
上一题中,nan(缺失值)也被同步追加了字符串
df1['B'] = df1['B'].map(lambda x:f'{x} Python', na_action='ignore')
4 - map|自定义函数
除了 lambda ,map还可以接受自定义函数,现在对第三列,使用自定义函数完成上一题的任务
def mapfun(x):
return str(x) + "Python"
df1['C'] = df1['C'].map(mapfun, na_action='ignore')
5 - applymap|lambda
applymap可以对整个 dataframe 工作,现在将 df1 的最后三列保留两位小数
df1[['D','E','F']] = df1[['D','E','F']].applymap(lambda x:"%.2f" % x)9-2 stack 与 unstack 6 - stack|数据堆叠
stack字面意思是数据堆叠,但是理解起来就是将数据由宽变长
stacked = df2.stack()7 - unstack|逆堆叠
对上一题的结果进行还原,即逆堆叠,过程如下图所示
stacked.unstack()8 - unstack|层级
在使用 unstack 进行逆堆叠时,可以指定层级,例如指定按照 second 进行,也就是如下图所示
stacked.unstack('second')
9-3 isin 筛选
通过 isin 可以快速筛选出包含某个值的结果
9 - isin|根据列表筛选筛选出 country 包含 'China','UK' 的行
df3[df3.country.isin(['China','UK'])]10 - isin|逆筛选
对上一题的结果取逆
df3[~df3.country.isin(['China','UK'])]9-4 select_dtypes 筛选
select_dtypes 可以筛选制定数据类型的列
11 - select_dtypes|单类型筛选 df4 数据类型为整数的列
df4.select_dtypes(include=['int64'])12 - select_dtypes|多类型
筛选 df4 数据类型为和浮点数的列
df4.select_dtypes(include=['int','float64'])13 - select_dtypes|排除
筛选 df4 数据类型为布尔值的列
df4.select_dtypes(exclude=['int','float64'])9-5 explode 数据展开
有时我们的数据中会包含列表,此时便可使用 explode 进行展开,将一个list拆成多行
14 - explode|单列将 df5 第 A 列进行展开
df5.explode('A')
15 - explode|多列
将 df5 第 A、C 列进行展开
df5.explode(list('AC')) # pandas版本 >= 1.3 才可以完成
9-6 nunique 统计
nunique 可以统计指定轴上不唯一的元素数量
16 - nunique|按列df6.nunique()17 - nunique|按行
df6.nunique(axis=1)9-7 cumsum 计算
cumsum 可以对数据按照指定方式进行累加
18 - cumsum|按列将 df7 按列进行累加
df[list('ABCD')].cumsum()
19 - cumsum|按行
将 df7 按行进行累加
df[list('ABCD')].cumsum(axis = 1)
20 - cumsum|按组
将 df7 按照 item 按不同组对第 A 列进行累加
df7 = df.sort_values(['item']).reset_index(drop=True)
df7['cusum']=df.groupby('item')['A'].cumsum(axis=0)
9-8 append|添加
21 - append|末尾追加
将 s2 添加至 df8 的末尾
result = df8.append(s2, ignore_index=True)22 - append|指定位置追加
将 s3 添加至 df8 的第三行
df9 = df8.iloc[:2, :] df10 = df8.iloc[2:, :] pd.concat([df9, s3, df10])23 - append|添加字典
将下面的字典 dicts 插入添加至 df8,并保留索引,如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b65URd3M-1647678788983)(https://pandas.pydata.org/pandas-docs/stable/_images/merging_append_dits.png)]
result = df8.append(dicts, ignore_index=True, sort=False)9-9 compare 比较
compare 用于比较两个数据框之间的差异
24 - compare|常规输出 df9 和 df10 的差异
df9.compare(df10)25 - compare|保留数据框
在上一题的要求下,保留原数据框
df9.compare(df10, keep_shape=True)26 - compare|保留值
在上一题的基础上,再保留原始相同的值
df9.compare(df10, keep_shape=True, keep_equal=True)10 - 数据可视化
import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['Songti SC'] plt.rcParams['axes.unicode_minus']=False %config InlineBackend.figure_format = 'retina'10-1 折线图 1 - 折线图|指定列
绘制 df 第一列的折线图
df['A'].plot() plt.show()2 - 折线图|子图
将 df 的四列分别放在四个子图上
df.plot(subplots=True) plt.show()3 - 折线图|全部列
绘制 df 全部列的折线图
df.plot() plt.show()4 - 折线图|调整大小
绘制 df 全部列的折线图,将大小调整为 1000*600 来让图片更美观
df.plot(figsize=(10,6)) plt.show()5 - 折线图|修改标题
在上一题的基础上,添加标题 Python
df.plot(figsize=(10,6),title='Python') plt.show()6 - 折线图|添加网格
在上一题的基础上,给折线图添加网格
df.plot(figsize=(10,6),title='早起Python',grid = True) plt.show()7 - 折线图|添加轴标签
在上一题的基础上,给X轴添加标签(时间),Y轴添加标签(数量)
df.plot(figsize=(10, 6), title='早起Python', grid=True, xlabel='时间', ylabel='数量') plt.show()8 - 折线图|调整刻度大小
在上一题的基础上,将刻度调大一点
df.plot(figsize=(10, 6), title='早起Python', grid=True, xlabel='时间', ylabel='数量',fontsize = 13) plt.show()9 - 折线图|调整文字大小
在上一题的基础上,将标题、坐标轴文字适当调大
df.plot(figsize=(10, 6), grid=True, fontsize = 13)
plt.title("Python",size = 17)
plt.xlabel('时间',size = 15)
plt.ylabel('数量',size =15)
plt.show()
10 - 折线图|图例位置
在上一题的基础上,将图例位置调整到左下角
df.plot(figsize=(10, 6), grid=True, fontsize = 13)
plt.title("Python",size = 17)
plt.xlabel('时间',size = 15)
plt.ylabel('数量',size =15)
plt.legend(loc=3)
plt.show()
11 - 折线图|双y轴
A、B使用一个y轴,CD使用一个y轴
ax = df.plot(secondary_y=['A', 'B'], figsize=(10, 6), fontsize = 13)
ax.set_ylabel('CD')
ax.right_ax.set_ylabel('AB')
ax.legend(loc=2)
plt.title("Python",size = 17)
plt.xlabel('时间',size = 15)
plt.ylabel('数量',size =15)
plt.legend(loc=1)
plt.show()
10-2 条形图
12 - 条形图|垂直
重新生成数据,并对使用条形图可视化 df2 的第 3 行
df2.iloc[2].plot(kind = 'bar', figsize=(10, 6)) plt.show()13 - 条形图|水平
绘制 df2 第 3 行的条形图,并设置为水平
df2.iloc[2].plot(kind = 'barh', figsize=(10, 6)) plt.show()14 - 条形图|多行
将df2的全部行在同一个画布上制作条形图
df2.plot(kind = 'bar', figsize=(10, 6)) plt.show()15 - 条形图|堆叠
在上一题的基础上,对条形图进行堆叠
df2.plot(kind = 'bar', figsize=(10, 6),stacked=True) plt.show()10-3 直方图 20 - 散点图|常规
重新生成数据 df4 ,并制作散点图,X轴为 a,Y轴为 b
df4.plot.scatter(x="a", y="b", figsize=(8, 6)) plt.show()21 - 散点图|大小
在上一题的基础上,让散点的大小随着值变化
df4.plot.scatter(x="a", y="b", figsize=(8, 6), s=df4["c"] * 200) plt.show()22 - 散点图|优化
在上一题的基础上,进行如下设置
散点固定调低透明度增加黑色边缘线
df4.plot.scatter(x="a", y="b", figsize=(8, 6), marker='o',
s=100, linewidths=1, alpha=0.8, edgecolors='black')
plt.show()
23 - 散点图|渐变
在上一题的基础上,将散点的颜色设置为渐变色
df4.plot.scatter(x="a", y="b",c="c", figsize=(8, 6), marker='o',
s=100, linewidths=1, alpha=0.8, edgecolors='black')
plt.show()
24 - 散点图|分组
将 ab 分为一组,cd分为一组,制作三散点图
ax = df4.plot.scatter(x="a", y="b", color="DarkBlue", label="Group 1", figsize=(8, 6), marker='o',
s=80, linewidths=1, alpha=0.8, edgecolors='black')
df4.plot.scatter(x="c", y="d", color="DarkGreen", label="Group 2", ax=ax, figsize=(8, 6), marker='o',
s=80, linewidths=1, alpha=0.8, edgecolors='black');
10-5 其他图形
25 - 箱线图
df5.plot.box(figsize=(8, 6)) plt.show()26 - 箱线图|修改颜色
color = {
"boxes": "DarkGreen",
"whiskers": "DarkOrange",
"medians": "DarkBlue",
"caps": "Gray",
}
df5.plot.box(color=color, sym="r+", figsize=(8, 6))
plt.show()
27 - 箱线图|水平
将上一题的图改为水平格式
df5.plot.box(vert=False,figsize=(8, 6),color=color) plt.show()28 - 面积图
df6.plot.area(figsize=(8, 6),alpha = 0.7) plt.show()29 - 六边形箱图
df7.plot.hexbin(x="a", y="b", gridsize=25, figsize=(8, 6));30 - 密度曲线图
df8.plot(kind='kde', figsize=(8, 6)) plt.show()样式 31 - 绘图主题
可以通过 seaborn 来修改绘图主题
import seaborn as sns
sns.set_palette("pastel", 8) #修改引号内内容改变颜色主题
df6.plot.area(figsize=(8, 6),alpha = 0.7)
plt.show()
32 - 绘图后端
修改pandas默认绘图引擎为plotly(需要提前安装好plotly)
pd.set_option("plotting.backend","plotly")
df6.plot.area()



