飞扬动力网站建设,九江做网站的公司,大连仟亿科技网站建设公司 概况,物流那个网站做推广好文章目录一、Pandas 读取文件二、CSV 文件读取1. 基本参数2. 通用解析参数3. 空值处理相关参数4. 时间处理相关参数5. 分块读入相关参数一、Pandas 读取文件
当使用 Pandas 做数据分析的时#xff0c;需要读取事先准备好的数据集#xff0c;这是做数据分析的第一步。Panda 提…
文章目录一、Pandas 读取文件二、CSV 文件读取1. 基本参数2. 通用解析参数3. 空值处理相关参数4. 时间处理相关参数5. 分块读入相关参数一、Pandas 读取文件
当使用 Pandas 做数据分析的时需要读取事先准备好的数据集这是做数据分析的第一步。Panda 提供了多种读取数据的方法针对不同的文件格式有以下几种1 read_csv() 用于读取文本文件。2 read_excel() 用于读取文本文件。3 read_json() 用于读取 json 文件。4 read_sql_query() 读取 sql 语句的。其通用的流程如下1 导入库 import pandas as pd。2 找到文件所在位置绝对路径 全称相对路径 和程序在同一个文件夹中的路径的简称。3 变量名 pd.读写操作方法文件路径具体的筛选条件……。
二、CSV 文件读取
CSV 又称逗号分隔值文件是一种简单的文件格式以特定的结构来排列表格数据。 CSV 文件能够以纯文本形式存储表格数据比如电子表格、数据库文件并具有数据交换的通用格式。CSV 文件会在 Excel 文件中被打开其行和列都定义了标准的数据格式。将 CSV 中的数据转换为 DataFrame 对象是非常便捷的。和一般文件读写不一样它不需要你做打开文件、读取文件、关闭文件等操作。相反您只需要一行代码就可以完成上述所有步骤并将数据存储在 DataFrame 中。下面进行实例演示源数据如下 首先我们对 CSV 文件进行读取可以通过相对路径也可以通过 os 动态取得绝对路径 os.getcwd() os.path.json。
import pandas as pd
df pd.read_csv(./data/my_csv.csv)
print(df,type(df))
# col1 col2 col3 col4 col5
#0 2 a 1.4 apple 2022/1/1
#1 3 b 3.4 banana 2022/1/2
#2 6 c 2.5 orange 2022/1/5
#3 5 d 3.2 grape 2022/1/7 class pandas.core.frame.DataFrame我们可以通过 os.getcwd() 读取文件的存储路径。
import os
os.getcwd()
#C:\\Users\\CQB\\Desktop\\内蒙农业大学数据分析教案和代码\\第16天其语法模板如下
read_csv(filepath_or_buffer, sep,, headerinfer, namesNone, index_colNone, usecolsNone, squeezeNone, prefixNone,
mangle_dupe_colsTrue, dtypeNone, engineNone, convertersNone, true_valuesNone, false_valuesNone, skipinitialspaceFalse,
skiprowsNone, skipfooter0, nrowsNone, na_valuesNone, keep_default_naTrue, na_filterTrue, verboseFalse,
skip_blank_linesTrue, parse_datesNone, infer_datetime_formatFalse, keep_date_colFalse, date_parserNone, dayfirstFalse,
cache_datesTrue, iteratorFalse, chunksizeNone, compressioninfer, thousandsNone, decimal., lineterminatorNone,
quotechar, quoting0, doublequoteTrue, escapecharNone, commentNone, encodingNone, encoding_errorsstrict, dialectNone,
error_bad_linesNone, warn_bad_linesNone, on_bad_linesNone, delim_whitespaceFalse, low_memoryTrue, memory_mapFalse,
float_precisionNone, storage_optionsNone)1. 基本参数
1 filepath_or_buffer数据输入的路径可以是文件路径、可以是 URL也可以是实现 read 方法的任意对象。这个参数就是我们输入的第一个参数。我们可以直接 read_csv 读取我们想要的文件。
import pandas as pd
pd.read_csv(rdata\students.csv)
#id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博 月亮星 女 2003/8/7
#2 3 张兆媛 艾尔星 女 2004/11/2
#3 4 付延旭 克哈星 男 2003/10/11
#4 5 王杰 查尔星 男 2002/6/12
#5 6 董泽宇 塔桑尼斯 男 2002/2/12还可以是一个 URL如果访问该 URL 会返回一个文件的话那么 pandas 的 read_csv函 数会自动将该文件进行读取。比如我们服务器上放的数据将刚才的文件返回。但需要注意的是他需要网络请求因此读取文件比较慢。
pd.read_csv(http://my-teaching.top/static/data/students.csv) 里面还可以是一个 _io.TextIOWrapper其中pandas 默认使用 utf-8 读取文件比如
f open(rdata\students.csv, encodingutf-8)
pd.read_csv(f)
#id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博 月亮星 女 2003/8/7
#2 3 张兆媛 艾尔星 女 2004/11/2
#3 4 付延旭 克哈星 男 2003/10/11
#4 5 王杰 查尔星 男 2002/6/12
#5 6 董泽宇 塔桑尼斯 男 2002/2/122 sep读取 csv 文件时指定的分隔符默认为逗号。注意csv 文件的分隔符和我们读取 csv 文件时指定的分隔符一定要一致。
import pandas as pd
pd.read_csv(rdata\students_step.csv)
#id|name|address|gender|birthday
#0 1|朱梦雪|地球村|女|2004/11/2
#1 2|许文博|月亮星|女|2003/8/7
#2 3|张兆媛|艾尔星|女|2004/11/2
#3 4|付延旭|克哈星|男|2003/10/11
#4 5|王杰|查尔星|男|2002/6/12
#5 6|董泽宇|塔桑尼斯|男|2002/2/12由于指定的分隔符和 csv 文件采用的分隔符不一致因此多个列之间没有分开而是连在一起了。 所以我们需要将分隔符设置成 \t 才可以。
df pd.read_csv(rdata\students_step.csv, sep|)
df
#id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博 月亮星 女 2003/8/7
#2 3 张兆媛 艾尔星 女 2004/11/2
#3 4 付延旭 克哈星 男 2003/10/11
#4 5 王杰 查尔星 男 2002/6/12
#5 6 董泽宇 塔桑尼斯 男 2002/2/123 delim_whitespace默认为 False设置为 True 时表示分割符为空白字符可以是空格、\t 等等。不管分隔符是什么只要是空白字符那么可以通过 delim_whitespaceTrue 进行读取。如下我们对 delim_whitespace 不设置也就是默认为 False会发现读取有点问题。
df pd.read_csv(rdata\students_whitespace.txt, sep )
df
#id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博\t月亮星 女 2003/8/7 NaN
#2 3 张兆媛 艾尔星 女 2004/11/2
#3 4 付延旭 克哈星 男 2003/10/11
#4 5 王杰\t查尔星 男 2002/6/12 NaN
#5 6 董泽宇\t塔桑尼斯 男 2002/2/12 NaN对此我们将 delim_whitespace 设置为 True便会得到我们想要的读取结果。
df pd.read_csv(rdata\students_whitespace.txt, delim_whitespaceTrue)
df
#id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博 月亮星 女 2003/8/7
#2 3 张兆媛 艾尔星 女 2004/11/2
#3 4 付延旭 克哈星 男 2003/10/11
#4 5 王杰 查尔星 男 2002/6/12
#5 6 董泽宇 塔桑尼斯 男 2002/2/124 header用作列名的行号以及数据的开头。默认行为是推断列名如果没有传递任何名称则该行为与 header0 相同并且从文件的第一行推断列名如果显式传递列名则该行为与 headerNone 相同。显式传递 header0 以替换现有名称。标题可以是整数列表指定列上多索引的行位置例如 [0,1,3]。未指定的中间行将被跳过例如本例中跳过 2 行。这里需要注意如果 skip_blank_linesTrue此参数将忽略注释行和空行因此 header0 表示数据的第一行而不是文件的第一行。5 names当 names 没被赋值时header 会变成 0即选取数据文件的第一行作为列名当 names 被赋值header 没被赋值时那么 header 会变成 None。如果都赋值就会实现两个参数的组合功能。a names 没有被赋值header 也没赋值这种情况下header 为 0即选取文件的第一行作为表头。
pd.read_csv(rdata\students.csv)
#id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博 月亮星 女 2003/8/7
#2 3 张兆媛 艾尔星 女 2004/11/2
#3 4 付延旭 克哈星 男 2003/10/11
#4 5 王杰 查尔星 男 2002/6/12
#5 6 董泽宇 塔桑尼斯 男 2002/2/12b names 没有被赋值header 被赋值如果不指定 names指定 header 为 1则选取第二行当做表头第二行下面为数据。
pd.read_csv(rdata\students.csv, header1)
#1 朱梦雪 地球村 女 2004/11/2
#0 2 许文博 月亮星 女 2003/8/7
#1 3 张兆媛 艾尔星 女 2004/11/2
#2 4 付延旭 克哈星 男 2003/10/11
#3 5 王杰 查尔星 男 2002/6/12
#4 6 董泽宇 塔桑尼斯 男 2002/2/12c names 被赋值header 没有被赋值
pd.read_csv(rdata\students.csv, names[编号, 姓名, 地址, 性别, 出生日期])
#编号 姓名 地址 性别 出生日期
#0 id name address gender birthday
#1 1 朱梦雪 地球村 女 2004/11/2
#2 2 许文博 月亮星 女 2003/8/7
#3 3 张兆媛 艾尔星 女 2004/11/2
#4 4 付延旭 克哈星 男 2003/10/11
#5 5 王杰 查尔星 男 2002/6/12
#6 6 董泽宇 塔桑尼斯 男 2002/2/12可以看到names 适用于没有表头的情况指定 names 没有指定 header那么 header 相当于 None。一般来说读取文件的时候会有一个表头一般默认是第一行但是有的文件中是没有表头的那么这个时候就可以通过 names 手动指定、或者生成表头而文件里面的数据则全部是内容。所以这里 id、name、address、date 也当成是一条记录了本来它是表头的但是我们指定了 names所以它就变成数据了表头是我们在 names 里面指定的。a names 和 header 都被赋值
pd.read_csv(rdata\students.csv,names[编号, 姓名, 地址, 性别, 出生日期],header1)
#编号 姓名 地址 性别 出生日期
#0 2 许文博 月亮星 女 2003/8/7
#1 3 张兆媛 艾尔星 女 2004/11/2
#2 4 付延旭 克哈星 男 2003/10/11
#3 5 王杰 查尔星 男 2002/6/12
#4 6 董泽宇 塔桑尼斯 男 2002/2/12这个时候相当于先不看 names只看 headerheader 为 0 代表先把第一行当做表头下面的当成数据然后再把表头用 names 给替换掉。 names 和 header 的使用场景主要如下1 csv 文件有表头并且是第一行那么 names 和 header 都无需指定2 csv 文件有表头、但表头不是第一行可能从下面几行开始才是真正的表头和数据这个时候指定 header 即可3 csv 文件没有表头全部是纯数据那么我们可以通过 names 手动生成表头4 csv 文件有表头、但是这个表头你不想用这个时候同时指定 names 和 header。先用 header 选出表头和数据然后再用 names 将表头替换掉就等价于将数据读取进来之后再对列名进行 rename。6 index_col我们在读取文件之后所得到的 DataFrame 的索引默认是 0、1、2……我们可以通过 set_index 设定索引但是也可以在读取的时候就指定某列为索引。
df pd.read_csv(rdata\students.csv, index_colbirthday)
df
# id name address gender
#birthday
#2004/11/2 1 朱梦雪 地球村 女
#2003/8/7 2 许文博 月亮星 女
#2004/11/2 3 张兆媛 艾尔星 女
#2003/10/11 4 付延旭 克哈星 男
#2002/6/12 5 王杰 查尔星 男
#2002/2/12 6 董泽宇 塔桑尼斯 男也可以用来删除指定列。
df.indexdf[birthday]
del df[birthday]
df
# id name address gender
#birthday
#2004/11/2 1 朱梦雪 地球村 女
#2003/8/7 2 许文博 月亮星 女
#2004/11/2 3 张兆媛 艾尔星 女
#2003/10/11 4 付延旭 克哈星 男
#2002/6/12 5 王杰 查尔星 男
#2002/2/12 6 董泽宇 塔桑尼斯 男我们在读取的时候指定了 name 列作为索引 此外除了指定单个列还可以指定多列作为索引比如 [“id”, “name”]。同时我们除了可以输入列名外还可以输入列对应的索引。比如“id”、“name”、“address”、date对应的索引就分别是 0、1、2、3。
df2 pd.read_csv(rdata\students.csv, index_col[gender,birthday])
df2
# id name address
#gender birthday
#女 2004/11/2 1 朱梦雪 地球村
# 2003/8/7 2 许文博 月亮星
# 2004/11/2 3 张兆媛 艾尔星
#男 2003/10/11 4 付延旭 克哈星
# 2002/6/12 5 王杰 查尔星
# 2002/2/12 6 董泽宇 塔桑尼斯使用 loc 删选也是同样的道理。
df2.loc[女]
# id name address
#birthday
#2004/11/2 1 朱梦雪 地球村
#2003/8/7 2 许文博 月亮星
#2004/11/2 3 张兆媛 艾尔星7 usecols返回列的子集。如果是类似列表的则所有元素都必须是位置性的即文档列中的整数索引或者是与用户在名称中提供的列名或从文档标题行推断的列名相对应的字符串。如果给出了名称则不考虑文档标题行。
pd.read_csv(rdata\students.csv, usecols[name,birthday])
# name
#0 朱梦雪
#1 许文博
#2 张兆媛
#3 付延旭
#4 王杰
#5 董泽宇2. 通用解析参数
1 encoding表示这只编码格式utf-8gbk。
pd.read_csv(rdata\students_gbk.csv) # UnicodeDecodeError 如果提示错误喂 UnicodeDecodeError — 需要想到编码问题。pandas 默认使用 utf-8 格式读取。
pd.read_csv(rdata\students_gbk.csv, encodinggbk)
#id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博 月亮星 女 2003/8/7
#2 3 张兆媛 艾尔星 女 2004/11/2
#3 4 付延旭 克哈星 男 2003/10/11
#4 5 王杰 查尔星 男 2002/6/12
#5 6 董泽宇 塔桑尼斯 男 2002/2/122 dtype在读取数据的时候设定字段的类型。比如公司员工的 id 一般是00001234如果默认读取的时候会显示为 1234所以这个时候要把他转为字符串类型才能正常显示为 00001234。
df pd.read_csv(rdata\students_step_001.csv, sep|)
df
#id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博 月亮星 女 2003/8/7
#2 3 张兆媛 艾尔星 女 2004/11/2
#3 4 付延旭 克哈星 男 2003/10/11
#4 5 王杰 查尔星 男 2002/6/12
#5 6 董泽宇 塔桑尼斯 男 2002/2/12我们将 id 的数据类型设置为字符串便可以显示为 001 之类的。
df pd.read_csv(rdata\students_step_001.csv, sep|, dtype {id:str})
df
#id name address gender birthday
#0 001 朱梦雪 地球村 女 2004/11/2
#1 002 许文博 月亮星 女 2003/8/7
#2 003 张兆媛 艾尔星 女 2004/11/2
#3 004 付延旭 克哈星 男 2003/10/11
#4 005 王杰 查尔星 男 2002/6/12
#5 006 董泽宇 塔桑尼斯 男 2002/2/123 converters在读取数据的时候对列数据进行变换.例如将 id 增加 10但是注意 int(x)在使用 converters 参数时解析器默认所有列的类型为 str所以需要进行类型转换。
pd.read_csv(data\students.csv, converters{id: lambda x: int(x) 10})
#id name address gender birthday
#0 11 朱梦雪 地球村 女 2004/11/2
#1 12 许文博 月亮星 女 2003/8/7
#2 13 张兆媛 艾尔星 女 2004/11/2
#3 14 付延旭 克哈星 男 2003/10/11
#4 15 王杰 查尔星 男 2002/6/12
#5 16 董泽宇 塔桑尼斯 男 2002/2/124 true_values 和 false_values指定哪些值应该被清洗为 True哪些值被清洗为 False。我们以性别为例男设置为 True女设置为 False。
pd.read_csv(data\students.csv, true_values[男], false_values[女])
# id name address gender birthday
#0 1 朱梦雪 地球村 False 2004/11/2
#1 2 许文博 月亮星 False 2003/8/7
#2 3 张兆媛 艾尔星 False 2004/11/2
#3 4 付延旭 克哈星 True 2003/10/11
#4 5 王杰 查尔星 True 2002/6/12
#5 6 董泽宇 塔桑尼斯 True 2002/2/12这里的替换规则为只有当某一列的数据类别全部出现在 true_values false_values 里面才会被替换。5 skiprows表示过滤行想过滤掉哪些行就写在一个列表里面传递给 skiprows 即可。注意的是这里是先过滤然后再确定表头比如
pd.read_csv(data\students.csv, skiprows[0,3])
# 1 朱梦雪 地球村 女 2004/11/2
#0 2 许文博 月亮星 女 2003/8/7
#1 4 付延旭 克哈星 男 2003/10/11
#2 5 王杰 查尔星 男 2002/6/12
#3 6 董泽宇 塔桑尼斯 男 2002/2/12这里把第一行过滤掉了因为第一行是表头所以在过滤掉之后第二行就变成表头了。 当然里面除了传入具体的数值来表明要过滤掉哪些行还可以传入一个函数。
pd.read_csv(data\students.csv, skiprowslambda x: x 0 and x % 2 0)
# id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 3 张兆媛 艾尔星 女 2004/11/2
#2 5 王杰 查尔星 男 2002/6/12由于索引从 0 开始所以凡是索引大于 0、并且%2 等于 0 的记录都过滤掉。索引大于 0是为了保证表头不被过滤掉。6 skipfooter表示从文件末尾过滤行。
pd.read_csv(data\students.csv, skipfooter1)上述代码运行后会出现报错并且表格中的数据都变成乱码具体原因下方有解释。
pd.read_csv(data\students.csv, skipfooter1, enginepython, encodingutf-8)
# id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博 月亮星 女 2003/8/7
#2 3 张兆媛 艾尔星 女 2004/11/2
#3 4 付延旭 克哈星 男 2003/10/11
#4 5 王杰 查尔星 男 2002/6/12pandas 解析数据时用的引擎目前解析引擎有两种c、python。默认为 c因为 c 引擎解析速度更快但是特性没有 python 引擎全。skipfooter 接收整型表示从结尾往上过滤掉指定数量的行因为引擎退化为 python那么要手动指定 engine“python”不然会警告。另外需要指定 encoding“utf-8”因为 csv 存在编码问题当引擎退化为 python 的时候在 Windows 上读取会乱码。7 nrows表示设置一次性读入的文件行数在读入大文件时很有用比如 16G 内存的 PC 无法容纳几百 G 的大文件。
pd.read_csv(data\students.csv, nrows3)
# id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博 月亮星 女 2003/8/7
#2 3 张兆媛 艾尔星 女 2004/11/23. 空值处理相关参数
na_values该参数可以配置哪些值需要处理成 NaN。
pd.read_csv(data\students.csv, na_values[女, 朱梦雪])#id name address gender birthday
#0 1 NaN 地球村 NaN 2004/11/2
#1 2 许文博 月亮星 NaN 2003/8/7
#2 3 张兆媛 艾尔星 NaN 2004/11/2
#3 4 付延旭 克哈星 男 2003/10/11
#4 5 王杰 查尔星 男 2002/6/12
#5 6 董泽宇 塔桑尼斯 男 2002/2/12可以看到将女和朱梦雪设置成了NaN这里的情况是不同的列中包含了不同的值。
4. 时间处理相关参数
parse_dates指定某些列为时间类型这个参数一般搭配 date_parser 使用。date_parser是用来配合 parse_dates 参数的因为有的列虽然是日期但没办法直接转化需要我们指定一个解析格式。
df pd.read_csv(data\students.csv)
df.dtypes
#id int64
#name object
#address object
#gender object
#birthday object
#dtype: object我们通过 parse_dates 将 birthday 设置为时间类型。
df pd.read_csv(data\students.csv, parse_dates[birthday])
df.dtypes
#id int64
#name object
#address object
#gender object
#birthday datetime64[ns]
#dtype: object5. 分块读入相关参数
1 iterator迭代器iterator 为 bool 类型默认为 False。如果为 True那么返回一个 TextFileReader 对象以便逐块处理文件。这个在文件很大、内存无法容纳所有数据文件时可以分批读入依次处理。
chunk pd.read_csv(data\students.csv, iteratorTrue)
chunk
#pandas.io.parsers.TextFileReader at 0x1b27f00ef88我们已经对文件进行了分块操作可以先提取出前两行。
print(chunk.get_chunk(2))
# id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博 月亮星 女 2003/8/7文件还剩下四行但是我们指定读取100那么也不会报错不够指定的行数那么有多少返回多少。
print(chunk.get_chunk(100))
# id name address gender birthday
#2 3 张兆媛 艾尔星 女 2004/11/2
#3 4 付延旭 克哈星 男 2003/10/11
#4 5 王杰 查尔星 男 2002/6/12
#5 6 董泽宇 塔桑尼斯 男 2002/2/12这里需要注意的是在读取完毕之后再读的话就会报错了。2 chunksize整型默认为 None设置文件块的大小。chunksize 还是返回一个类似于迭代器的对象当我们调用 get_chunk如果不指定行数那么就是默认的 chunksize。
chunk pd.read_csv(data\students.csv, chunksize2)
print(chunk)
print(chunk.get_chunk())
#pandas.io.parsers.TextFileReader object at 0x000001B27F05C5C8
# id name address gender birthday
#0 1 朱梦雪 地球村 女 2004/11/2
#1 2 许文博 月亮星 女 2003/8/7我们再使用两次 print(chunk.get_chunk()) 就可以分步读取出所有的数据因为这里的 chunksize 设置为 2。我们也可以指定 chunk.get_chunk() 的参数。以上便是 pandas 的 read_csv 函数中绝大部分参数了同时其中的部分参数也适用于读取其它类型的文件。其实在读取 csv 文件时所使用的参数不多很多参数平常我们都不会用到的不过不妨碍我们了解一下因为在某些特定的场景下它们是可以很方便地帮我们解决一些问题的。个人感觉分块读取这个参数最近在工作中提高了很大的效率。