首页Python【Python数据分析】2...

【Python数据分析】26.文本格式数据的读写


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接: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 使用一组常见的标识,例如 NANULL。通过 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  河北   东部


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments