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
文件,
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
修改数据显示的设置。
注意【】并未修改数据,仅是在原有数据基础上优化显示状态,随时可以通过重置选项重置全部设置,恢复数据默认显示状态。
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
输出的数据均是一次性的(可以复用、导出),因此你应该在合适的时间选择使用该方法。 下面仅列举常用的方法,若想了解更多可以查阅
重新加载数据
为了方便理解,重新读取data.csv
'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日
链接