本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj
提取码:mnsj
-
前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis
根据《Python for Data Analysis 3rd Edition》翻译整理
—————-————————————-
1.文件解析函数:
将表格型数据读取为DataFrame对象是Pandas的重要特性。
pandas中的文本和二进制数据加载函数如下所示:
函数 |
说明 |
read_csv | 从文件、URL或文件型对象中加载带分隔符的数据;使用逗号作为默认分隔符 |
read_fwf | 从固定宽度格式的文件中读取数据(无分隔符) |
read_clipboard | read_csv 变体,从剪贴板读取数据;用于从网页转换表格 |
read_excel | XLS 或 XLSX 文件中读取表格数据 |
read_hdf | 读取 pandas 存储的 HDF5 文件 |
read_html | 从HTML文件中读取表格数据 |
read_json |
从JSON字符串中读取数据 |
read_feather | 读取 Feather 二进制文件格式 |
read_orc | 读取 Apache ORC 二进制文件格式 |
read_parquet | 读取Apache Parquet 二进制文件格式 |
read_pickle | 读取以Python pickle 格式存储的对象 |
read_sas | 读取存储在 SAS 系统中定制存储格式的 SAS 数据集 |
read_spss | 读取 SPSS 创建的数据文件 |
read_sql | 读取 SQL 查询的结果(使用 SQLAlchemy) |
read_sql_table | 读取整个 SQL 表(使用 SQLAlchemy);等同于使用 read_sql 选择该表中所有内容的查询 |
read_stata | 从 Stata 文件格式读取数据集 |
read_xml | 从 XML 文件中读取数据表 |
2.read_csv()参数汇总:
数据分析中最常用的文件格式为csv文件(逗号分隔的文件),因此使用pandas读取文件时最常用的函数主要是pandas.read_csv。
read_csv函数的常用参数如下所示:
参数 |
说明 |
path | 表明文件系统位置的字符串、URL 或文件型对象 |
sep or delimiter |
用于分隔每行字段的字符序列或正则表达式 |
header | 用作列名的行号,默认为 0(第一行),但如果没有标题行,则应为 None |
index_col | 在结果中用作行索引的列号或列名,可以是单个名称/数字或它们的列表(用于分层索引) |
names | 结果的列名列表 |
skiprows | 要忽略的文件的行数或要跳过的行号列表(从 0 开始) |
na_values | 用 NA 替换的值序列。除非传递 keep_default_na=False,否则它们将添加到默认列表中 |
keep_default_na | 是否使用默认的 NA 值列表(默认为 True) |
comment | 在行结尾处分隔注释的字符 |
parse_dates | 尝试将数据解析为datetime;默认为False。如果为True,将尝试解析所有列。也可以指定要解析的列号或列名的列表。如果列表的元素是元组或列表,将会把多个列组合在一起并解析为日期(例如,日期/时间分为两列) |
keep_date_col | 如果连接列来解析日期,保留被连接的列;默认为False |
converters | 包含列号或列名映射到函数的字典(例如,{“foo”: f} 会将函数 f 应用于 “foo” 列中的所有值) |
dayfirst | 在解析非明确的日期时,将其按国际格式处理(例如,7/6/2012 -> June 7, 2012);默认为False |
date_parser | 用于解析日期的函数 |
nrows | 从文件开头读取的行数(不包括标题) |
iterator | 返回一个 TextFileReader 对象以逐段读取文件。该对象也可以与 with 语句一起使用 |
chunksize | 用于迭代的块大小 |
skip_footer | 忽略文件尾部的行数 |
verbose | 打印各种解析信息,比如文件转换的每个阶段所花费的时间和内存使用信息 |
encoding | 文本编码(例如,“utf-8 表示 UTF-8 编码的文本”)。如果没有,则默认为“utf-8” |
squeeze | 如果解析的数据只包含一列,则返回一个 Series |
thousands | 千位分隔符(例如"," or "." );默认为None |
decimal | 数字中的小数点分隔符(例如,"." or "," );默认为“.” |
engine | 使用 CSV 解析和转换引擎;可以是“c”、“python”或“pyarrow”之一。默认是“c”,尽管较新的“pyarrow”引擎可以更快地解析一些文件。“python”引擎速度较慢,但支持其他引擎不支持的一些功能 |
3.read_csv():
本次介绍read_csv函数用于读取数据时常用的部分参数。
本次以2018年全年PM2.5超标城市数据为例。
1>>> df = pd.read_csv("data/PM25.csv",encoding='gb18030')
2>>> df
3 城市 超标天数 超标月数 省份 所在区域
40 和田 177 5.90 新疆 西部
51 喀什 163 5.43 新疆 西部
62 石家庄 117 3.90 河北 东部
73 阿克苏 113 3.77 新疆 西部
84 临汾 110 3.67 山西 中部
95 保定 109 3.63 河北 东部
106 咸阳 107 3.57 陕西 中部
117 安阳 104 3.47 河南 中部
128 邢台 103 3.43 河北 东部
-
name参数
当读取文件没有表头时,通过设置 header=None 参数,此时Pandas会自动分配列名。
1# 读取无表头文件
2>>> df = pd.read_csv("data/PM25_no_header.csv",encoding='gb18030',header=None)
3>>> df
4 0 1 2 3 4
50 和田 177 5.90 新疆 西部
61 喀什 163 5.43 新疆 西部
72 石家庄 117 3.90 河北 东部
83 阿克苏 113 3.77 新疆 西部
94 临汾 110 3.67 山西 中部
105 保定 109 3.63 河北 东部
116 咸阳 107 3.57 陕西 中部
127 安阳 104 3.47 河南 中部
138 邢台 103 3.43 河北 东部
也可以通过 name 参数指定自定义列名。
1# 指定自定义列名
2>>> names = ["city" , "day" , "months" , "province" , "region"]
3
4>>> df = pd.read_csv("data/PM25_no_header.csv",encoding='gb18030',header=None,names=names)
5>>> df
6 city day months province region
70 和田 177 5.90 新疆 西部
81 喀什 163 5.43 新疆 西部
92 石家庄 117 3.90 河北 东部
103 阿克苏 113 3.77 新疆 西部
114 临汾 110 3.67 山西 中部
125 保定 109 3.63 河北 东部
136 咸阳 107 3.57 陕西 中部
147 安阳 104 3.47 河南 中部
158 邢台 103 3.43 河北 东部
-
index_col参数
读取文件时,如果想使用某一列作为索引,可以将列名传递给 index_col 参数。
1# 使用“城市”列作为索引
2>>> df = pd.read_csv("data/PM25.csv",encoding='gb18030' , index_col="城市")
3>>> df
4 超标天数 超标月数 省份 所在区域
5城市
6和田 177 5.90 新疆 西部
7喀什 163 5.43 新疆 西部
8石家庄 117 3.90 河北 东部
9阿克苏 113 3.77 新疆 西部
10临汾 110 3.67 山西 中部
11保定 109 3.63 河北 东部
12咸阳 107 3.57 陕西 中部
13安阳 104 3.47 河南 中部
14邢台 103 3.43 河北 东部
如果想要使用多列组成一个分层索引,需要给index_col 参数传递一个包含序号或类名的列表。
1# 使用“省份”、所在区域”两列组成分层索引
2>>> df = pd.read_csv("data/PM25.csv",encoding='gb18030' , index_col=["所在区域","省份"])
3>>> df
4 城市 超标天数 超标月数
5所在区域 省份
6西部 新疆 和田 177 5.90
7 新疆 喀什 163 5.43
8东部 河北 石家庄 117 3.90
9西部 新疆 阿克苏 113 3.77
10中部 山西 临汾 110 3.67
11东部 河北 保定 109 3.63
12中部 陕西 咸阳 107 3.57
13 河南 安阳 104 3.47
14东部 河北 邢台 103 3.43
-
sep参数
在某些情况下,表格可能没有固定的分隔符,例如,使用空格或其他一些模式来分隔字段。
此时,可以向 sep 参数传递指定分隔符或者一个正则表达式作为分隔符。
1# 将分隔符设置为空格
2>>> df = pd.read_csv("data/PM25_sep.csv",encoding='gb18030' , sep=" ")
3>>> df
4 城市 超标天数 超标月数 省份 所在区域
50 和田 177 5.90 新疆 西部
61 喀什 163 5.43 新疆 西部
72 石家庄 117 3.90 河北 东部
83 阿克苏 113 3.77 新疆 西部
94 临汾 110 3.67 山西 中部
105 保定 109 3.63 河北 东部
116 咸阳 107 3.57 陕西 中部
127 安阳 104 3.47 河南 中部
138 邢台 103 3.43 河北 东部
14
15# 将一个正则表达式传递给分隔符参数
16>>> df = pd.read_csv("data/PM25_sep.csv",encoding='gb18030' , sep="s+")
17>>> df
18 城市 超标天数 超标月数 省份 所在区域
190 和田 177 5.90 新疆 西部
201 喀什 163 5.43 新疆 西部
212 石家庄 117 3.90 河北 东部
223 阿克苏 113 3.77 新疆 西部
234 临汾 110 3.67 山西 中部
245 保定 109 3.63 河北 东部
256 咸阳 107 3.57 陕西 中部
267 安阳 104 3.47 河南 中部
278 邢台 103 3.43 河北 东部
-
skiprows 参数
文件解析函数有许多额外的参数来帮助处理出现的各种异常文件格式。例如,可以使用 skiprows 参数跳过文件的某一行或多行。
需要注意的是,当文件存在表头时,表头是第一行。
1# 跳过第二行和第九行
2>>> df = pd.read_csv("data/PM25.csv",encoding='gb18030' , skiprows=[1,8])
3>>> df
4 城市 超标天数 超标月数 省份 所在区域
50 喀什 163 5.43 新疆 西部
61 石家庄 117 3.90 河北 东部
72 阿克苏 113 3.77 新疆 西部
83 临汾 110 3.67 山西 中部
94 保定 109 3.63 河北 东部
105 咸阳 107 3.57 陕西 中部
116 邢台 103 3.43 河北 东部
-
缺失值处理
处理缺失值是文件读取过程中一个重要且微妙的部分。丢失的数据通常不存在(空字符串)或由一些标记(占位符)值标记。默认情况下,pandas 使用一组常见的标识,例如 NA 和 NULL。通过 pd.isna() 可以查看缺失值情况。
1# 读取有缺失值的文件
2>>> df = pd.read_csv("data/PM25_nan.csv",encoding='gb18030')
3>>> df
4 城市 超标天数 超标月数 省份 所在区域
50 和田 NaN 999.00 新疆 西部
61 喀什 163.0 5.43 新疆 西部
72 石家庄 117.0 3.90 河北 东部
83 阿克苏 113.0 3.77 新疆 NaN
94 临汾 0.0 3.67 山西 中部
105 保定 109.0 3.63 河北 东部
116 咸阳 107.0 NaN 陕西 中部
127 安阳 104.0 3.47 河南 中部
138 邢台 103.0 0.00 河北 东部
14
15# 查看缺失值情况
16>>> pd.isna(df)
17 城市 超标天数 超标月数 省份 所在区域
180 False True False False False
191 False False False False False
202 False False False False False
213 False False False False True
224 False False False False False
235 False False False False False
246 False False True False False
257 False False False False False
268 False False False False False
read_csv()有许多默认 NA 值表示,但可以使用 keep_default_na=False 选项禁用这些默认值。
1# keep_default_na
2>>> df = pd.read_csv("data/PM25_nan.csv",encoding='gb18030',keep_default_na=False)
3>>> df
4 城市 超标天数 超标月数 省份 所在区域
50 和田 999 新疆 西部
61 喀什 163 5.43 新疆 西部
72 石家庄 117 3.9 河北 东部
83 阿克苏 113 3.77 新疆 NaN
94 临汾 0 3.67 山西 中部
105 保定 109 3.63 河北 东部
116 咸阳 107 陕西 中部
127 安阳 104 3.47 河南 中部
138 邢台 103 0 河北 东部
14
15>>> pd.isna(df)
16 城市 超标天数 超标月数 省份 所在区域
170 False False False False False
181 False False False False False
192 False False False False False
203 False False False False False
214 False False False False False
225 False False False False False
236 False False False False False
247 False False False False False
258 False False False False False
可以通过 na_values 参数处理个性化缺失值。此时将需要识别为缺失值的字符串列表传递给该参数。
例如读取的文件中,有两列数据中存在0值,可以通过该参数将其均设置为缺失值。
1# na_values
2>>> df = pd.read_csv("data/PM25_nan.csv",encoding='gb18030' , na_values=0)
3>>> df
4 城市 超标天数 超标月数 省份 所在区域
50 和田 NaN 999.00 新疆 西部
61 喀什 163.0 5.43 新疆 西部
72 石家庄 117.0 3.90 河北 东部
83 阿克苏 113.0 3.77 新疆 NaN
94 临汾 NaN 3.67 山西 中部
105 保定 109.0 3.63 河北 东部
116 咸阳 107.0 NaN 陕西 中部
127 安阳 104.0 3.47 河南 中部
138 邢台 103.0 NaN 河北 东部
可以通过传递字典形式内容,给不同列指定不同的缺失值标识。
例如,对“超标天数”列将0值设置为缺失值,对“超标月数”列将0和999均设置为缺失值。
1>>> sentinels = {"超标天数":[0] , "超标月数":[0,999]}
2
3>>> df = pd.read_csv("data/PM25_nan.csv",encoding='gb18030' , na_values=sentinels)
4>>> df
5 城市 超标天数 超标月数 省份 所在区域
60 和田 NaN NaN 新疆 西部
71 喀什 163.0 5.43 新疆 西部
82 石家庄 117.0 3.90 河北 东部
93 阿克苏 113.0 3.77 新疆 NaN
104 临汾 NaN 3.67 山西 中部
115 保定 109.0 3.63 河北 东部
126 咸阳 107.0 NaN 陕西 中部
137 安阳 104.0 3.47 河南 中部
148 邢台 103.0 NaN 河北 东部
本篇文章来源于微信公众号: 码农设计师