栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pandas搴撶殑浣跨敤(pandas甯哥敤鏂规硶)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pandas搴撶殑浣跨敤(pandas甯哥敤鏂规硶)

1 - 数据加载与存储 1-1 数据读取 1 读取 Excel 文件

读取当前目录下 某招聘网站数据.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.shape
2 - 随机查看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.size
3 - 数据排序

将数据按照总分升序排列,并展示前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).T
11 - 统计信息|分组

计算各省市总分均值

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.dtypes
8 - 数据修改|修改类型

将 金牌数 列类型修改为 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']).groups
8 - 分组查看|指定

将数据按照 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()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/772535.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号