pandas读取文件官方提供的文档
在使用pandas读取文件之前,必备的内容,必然属于官方文档,官方文档查阅地址
文档操作属于pandas里面的Input/Output
也就是IO操作,基本的API都在上述网址,接下来本文核心带你理解部分常用的命令
pandas读取txt文件
读取txt文件需要确定txt文件是否符合基本的格式,也就是是否存在\t
,,,
等特殊的分隔符
一般txt文件长成这个样子
txt文件举例
下面的文件为空格间隔
1 | yaml复制代码1 2019-03-22 00:06:24.4463094 中文测试 |
读取命令采用 read_csv或者 read_table都可以
1 | bash复制代码import pandas as pd |
但是,注意,这个地方读取出来的数据内容为3行1列的DataFrame类型,并没有按照我们的要求得到3行4列
1 | python复制代码import pandas as pd |
read_csv函数
默认: 从文件、URL、文件新对象中加载带有分隔符的数据,默认分隔符是逗号。
上述txt文档并没有逗号分隔,所以在读取的时候需要增加sep分隔符参数
1 | ini复制代码df = pd.read_csv("./test.txt",sep=' ') |
参数说明,官方Source : github.com/pandas-dev/…
中文说明以及重点功能案例
参数 | 中文释义 |
---|---|
filepath_or_buffer | 可以是URL,可用URL类型包括:http, ftp, s3和文件,本地文件读取实例:file://localhost/path/to/table.csv |
sep | str类型,默认’,’ 指定分隔符。如果不指定参数,则会尝试使用默认值逗号分隔。分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:’\r\t’ |
delimiter | 定界符,备选分隔符(如果指定该参数,则sep参数失效) 一般不用 |
delimiter_whitespace | True or False 默认False, 用空格作为分隔符等价于spe=’\s+’如果该参数被调用,则delimite不会起作用 |
header | 指定第几行作为列名(忽略注解行),如果没有指定列名,默认header=0; 如果指定了列名header=None |
names | 指定列名,如果文件中不包含header的行,应该显性表示header=None ,header可以是一个整数的列表,如0,1,3。未指定的中间行将被删除(例如,跳过此示例中的2行) |
index_col(案例1) | 默认为None 用列名作为DataFrame的行标签,如果给出序列,则使用MultiIndex。如果读取某文件,该文件每行末尾都有带分隔符,考虑使用index_col=False使panadas不用第一列作为行的名称。 |
usecols | 默认None 可以使用列序列也可以使用列名,如 0, 1, 2 or ‘foo’, ‘bar’, ‘baz’ ,使用这个参数可以加快加载速度并降低内存消耗。 |
squeeze | 默认为False, True的情况下返回的类型为Series,如果数据经解析后仅含一行,则返回Series |
prefix | 自动生成的列名编号的前缀,如: ‘X’ for X0, X1, … 当header =None 或者没有设置header的时候有效 |
mangle_dupe_cols | 默认为True,重复的列将被指定为’X.0’…’X.N’,而不是’X’…’X’。如果传入False,当列中存在重复名称,则会导致数据被覆盖。 |
dtype | 例子: {‘a’: np.float64, ‘b’: np.int32} 指定每一列的数据类型,a,b表示列名 |
engine | 使用的分析引擎。可以选择C或者是python,C引擎快但是Python引擎功能更多一些 |
converters(案例2) | 设置指定列的处理函数,可以用”序号”也可以使用“列名”进行列的指定 |
true_values / false_values | 没有找到实际的应用场景,备注一下,后期完善 |
skipinitialspace | 忽略分隔符后的空格,默认false |
skiprows | 默认值 None 需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始) |
skipfooter | 从文件尾部开始忽略。 (c引擎不支持) |
nrows | 从文件中只读取多少数据行,需要读取的行数(从文件头开始算起) |
na_values | 空值定义,默认情况下, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’. 都表现为NAN |
keep_default_na | 如果指定na_values参数,并且keep_default_na=False,那么默认的NaN将被覆盖,否则添加 |
na_filter | 是否检查丢失值(空字符串或者是空值)。对于大文件来说数据集中没有N/A空值,使用na_filter=False可以提升读取速度。 |
verbose | 是否打印各种解析器的输出信息,例如:“非数值列中缺失值的数量”等。 |
skip_blank_lines | 如果为True,则跳过空行;否则记为NaN。 |
parse_dates | 有如下的操作1. boolean. True -> 解析索引2. list of ints or names. e.g. If 1, 2, 3 -> 解析1,2,3列的值作为独立的日期列;3. list of lists. e.g. If [1, 3] -> 合并1,3列作为一个日期列使用 4. dict, e.g. {‘foo’ : 1, 3} -> 将1,3列合并,并给合并后的列起名为”foo” |
infer_datetime_format | 如果设定为True并且parse_dates 可用,那么pandas将尝试转换为日期类型,如果可以转换,转换方法并解析。在某些情况下会快5~10倍 |
keep_date_col | 如果连接多列解析日期,则保持参与连接的列。默认为False |
date_parser | 用于解析日期的函数,默认使用dateutil.parser.parser来做转换。Pandas尝试使用三种不同的方式解析,如果遇到问题则使用下一种方式。1.使用一个或者多个arrays(由parse_dates指定)作为参数;2.连接指定多列字符串作为一个列作为参数;3.每行调用一次date_parser函数来解析一个或者多个字符串(由parse_dates指定)作为参数。 |
dayfirst | DD/MM格式的日期类型 |
iterator | 返回一个TextFileReader 对象,以便逐块处理文件。 |
chunksize | 文件块的大小 |
compression | 直接使用磁盘上的压缩文件。如果使用infer参数,则使用 gzip, bz2, zip或者解压文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’这些为后缀的文件,否则不解压。如果使用zip,那么ZIP包中国必须只包含一个文件。设置为None则不解压。 |
新版本0.18.1版本支持zip和xz解压 | |
thousands | 千分位符号,默认‘,’ |
decimal | 小数点符号,默认‘.’ |
lineterminator | 行分割符,只在C解析器下使用 |
quotechar | 引号,用作标识开始和解释的字符,引号内的分割符将被忽略 |
quoting | 控制csv中的引号常量。可选 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3) |
doublequote | 双引号,当单引号已经被定义,并且quoting 参数不是QUOTE_NONE的时候,使用双引号表示引号内的元素作为一个元素使用。 |
escapechar | 当quoting 为QUOTE_NONE时,指定一个字符使的不受分隔符限值。 |
comment | 标识着多余的行不被解析。如果该字符出现在行首,这一行将被全部忽略。这个参数只能是一个字符,空行(就像skip_blank_lines=True)注释行被header和skiprows忽略一样。例如如果指定comment=’#’ 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那么返回结果将是以’a,b,c’作为header |
encoding | 编码方式,指定字符集类型,通常指定为’utf-8’ |
dialect | 如果没有指定特定的语言,如果sep大于一个字符则忽略。具体查看csv.Dialect 文档 |
error_bad_lines | 如果一行包含太多的列,那么默认不会返回DataFrame ,如果设置成false,那么会将改行剔除(只能在C解析器下使用) |
warn_bad_lines | 如果error_bad_lines =False,并且warn_bad_lines =True 那么所有的“bad lines”将会被输出(只能在C解析器下使用) |
low_memory | 分块加载到内存,再低内存消耗中解析。但是可能出现类型混淆。确保类型不被混淆需要设置为False。或者使用dtype 参数指定类型。注意使用chunksize 或者iterator 参数分块读入会将整个文件读入到一个Dataframe,而忽略类型(只能在C解析器中有效) |
delim_whitespace | New in version 0.18.1: Python解析器中有效 |
memory_map | 如果为filepath_or_buffer提供了文件路径,则将文件对象直接映射到内存上,并直接从那里访问数据。使用此选项可以提高性能,因为不再有任何I / O开销,使用这种方式可以避免文件再次进行IO操作 |
float_precision | 指定C引擎应用于浮点值的转换器 |
该表格部分参考 博客 www.cnblogs.com/datablog/p/… 感谢博主的翻译,O(∩_∩)O哈哈~
案例1
index_col 使用
首先准备一个txt文件,这个文件最大的问题是在每行的末尾多了一个’,’ ,按照提示解释为,如果每行末尾都有分隔符,会出现问题,但是在实际测试的时候发现需要配合names参数,才可以出现效果
1 | bash复制代码goof,1,2,3,ddd, |
该表格部分参考 博客 www.cnblogs.com/datablog/p/… 感谢博主的翻译,O(∩_∩)O哈哈~
案例1
index_col 使用
首先准备一个txt文件,这个文件最大的问题是在每行的末尾多了一个’,’ ,按照提示解释为,如果每行末尾都有分隔符,会出现问题,但是在实际测试的时候发现需要配合names参数,才可以出现效果
1 | bash复制代码goof,1,2,3,ddd, |
编写如下代码
1 | bash复制代码df = pd.read_csv("./demo.txt",header=None,names=['a','b','c','d','e']) |
其实发现意义还真不是很大,可能文档并没有表述清楚他的具体作用。接下来说一下index_col的常见用途
在读取文件的时候,如果不设置index_col列索引,默认会使用从0开始的整数索引。当对表格的某一行或列进行操作之后,在保存成文件的时候你会发现总是会多一列从0开始的列,如果设置index_col参数来设置列索引,就不会出现这种问题了。
案例2
converters 设置指定列的处理函数,可以用”序号”也可以使用“列名”进行列的指定
1 | kotlin复制代码import pandas as pd |
read_csv函数过程中常见的问题
- 有的IDE中利用Pandas的read_csv函数导入数据文件时,若文件路径或文件名包含中文,会报错。
解决办法
1 | ini复制代码import pandas as pd |
- 排除某些行 使用 参数 skiprows.它的功能为排除某一行。 要注意的是:排除前3行是skiprows=3 排除第3行是skiprows=3
- 对于不规则分隔符,使用正则表达式读取文件 文件中的分隔符采用的是空格,那么我们只需要设置sep=” “来读取文件就可以了。当分隔符并不是单个的空格,也许有的是一个空格有的是多个空格时,如果这个时候还是采用sep=” “来读取文件,也许你就会得到一个很奇怪的数据,因为它会将空格也做为数据。 data = pd.read_csv(“data.txt”,sep=”\s+”)
- 读取的文件中如果出现中文编码错误 需要设定 encoding 参数
- 为行和列添加索引 用参数names添加列索引,用index_col添加行索引
read_csv该命令有相当数量的参数。大多数都是不必要的,因为你下载的大部分文件都有标准格式。
read_table函数
基本用法是一致的,区别在于separator分隔符。
csv是逗号分隔值,仅能正确读入以 “,” 分割的数据,read_table默认是’\t’(也就是tab)切割数据集的
read_fwf 函数
读取具有固定宽度列的文件,例如文件
1 | 复制代码id8141 360.242940 149.910199 11950.7 |
read_fwf 命令有2个额外的参数可以设置
colspecs :
需要给一个元组列表,元组列表为半开区间,[from,to) ,默认情况下它会从前100行数据进行推断。
例子:
1 | ini复制代码import pandas as pd |
widths:
直接用一个宽度列表,可以代替colspecs
参数
1 | ini复制代码widths = [6, 14, 13, 10] |
read_fwf 使用并不是很频繁,可以参照 pandas.pydata.org/pandas-docs… 学习
read_msgpack 函数
pandas支持的一种新的可序列化的数据格式,这是一种轻量级的可移植二进制格式,类似于二进制JSON,这种数据空间利用率高,在写入(序列化)和读取(反序列化)方面都提供了良好的性能。
read_clipboard 函数
读取剪贴板中的数据,可以看作read_table的剪贴板版本。在将网页转换为表格时很有用
这个地方出现如下的BUG
module ‘pandas’ has no attribute ‘compat’
我更新了一下pandas 既可以正常使用了
还有一个比较坑的地方,就是在读取剪切板的时候,如果复制了中文,很容易读取不到数据
解决办法
- 打开site-packages\pandas\io\clipboard.py 这个文件需要自行检索
- 在 text = clipboard_get() 后面一行 加入这句: text = text.decode(‘UTF-8’)
- 保存,然后就可以使用了
read_excel 函数
依旧是官方文档一码当先:pandas.pydata.org/pandas-docs…
参数 | 中文释义 |
---|---|
io | 文件类对象 ,pandas Excel 文件或 xlrd 工作簿。该字符串可能是一个URL。URL包括http,ftp,s3和文件。例如,本地文件可写成file://localhost/path/to/workbook.xlsx |
sheet_name | 默认是sheetname为0,返回多表使用sheetname=0,1,若sheetname=None是返回全表 。注意:int/string返回的是dataframe,而none和list返回的是dict of dataframe,表名用字符串表示,索引表位置用整数表示; |
header | 指定作为列名的行,默认0,即取第一行,数据为列名行以下的数据;若数据不含列名,则设定 header = None; |
names | 指定列的名字,传入一个list数据 |
index_col | 指定列为索引列,也可以使用u”strings” ,如果传递一个列表,这些列将被组合成一个MultiIndex。 |
squeeze | 如果解析的数据只包含一列,则返回一个Series |
dtype | 数据或列的数据类型,参考read_csv即可 |
engine | 如果io不是缓冲区或路径,则必须将其设置为标识io。 可接受的值是None或xlrd |
converters | 参照read_csv即可 |
其余参数 | 基本和read_csv一致 |
pandas 读取excel文件如果报错,一般处理为
错误为:ImportError: No module named ‘xlrd’
pandas读取excel文件,需要单独的xlrd模块支持 pip install xlrd 即可
read_json 函数
参数 | 中文释义 |
---|---|
path_or_buf | 一个有效的JSON文件,默认值为None,字符串可以为URL,例如file://localhost/path/to/table.json |
orient (案例1) | 预期的json字符串格式,orient的设置有以下几个值:1. ‘split’ : dict like {index -> index, columns -> columns, data -> values}2. ‘records’ : list like {column -> value}, … , {column -> value}3. ‘index’ : dict like {index -> {column -> value}}4. ‘columns’ : dict like {column -> {index -> value}}5. ‘values’ : just the values array |
typ | 返回的格式(series or frame), 默认是 ‘frame’ |
dtype | 数据或列的数据类型,参考read_csv即可 |
convert_axes | boolean,尝试将轴转换为正确的dtypes,默认值为True |
convert_dates | 解析日期的列列表;如果为True,则尝试解析类似日期的列,默认值为True参考列标签it ends with ‘_at’,it ends with ‘_time’,it begins with ‘timestamp’,it is ‘modified’,it is ‘date’ |
keep_default_dates | boolean,default True。如果解析日期,则解析默认的日期样列 |
numpy | 直接解码为numpy数组。默认为False;仅支持数字数据,但标签可能是非数字的。还要注意,如果numpy=True,JSON排序MUST |
precise_float | boolean,默认False。设置为在将字符串解码为双精度值时启用更高精度(strtod)函数的使用。默认值(False)是使用快速但不太精确的内置功能 |
date_unit | string,用于检测转换日期的时间戳单位。默认值无。默认情况下,将检测时间戳精度,如果不需要,则通过’s’,’ms’,’us’或’ns’之一分别强制时间戳精度为秒,毫秒,微秒或纳秒。 |
encoding | json编码 |
lines | 每行将文件读取为一个json对象。 |
如果JSON不可解析,解析器将产生ValueError/TypeError/AssertionError之一。
案例1
- orient=’split’
1 | less复制代码 import pandas as pd |
- orient=’records’ 成员为字典列表
1 | ini复制代码import pandas as pd |
- orient=’index’ 以索引为key,以列字段构成的字典为键值。如: s = ‘{“0”:{“a”:1,”b”:2},”1”:{“a”:2,”b”:4}}’
- orient=’columns’ 或者 values 自己推断即可
部分中文翻译,可以参考github> github.com/apachecn/pa…
read_json()常见BUG
读取json文件出现 ValueError: Trailing data
,JSON格式问题
原格式为
1 | css复制代码{"a":1,"b":1},{"a":2,"b":2} |
调整为
1 | css复制代码[{"a":1,"b":1},{"a":2,"b":2}] |
或者使用lines参数,并且JSON调整为每行一条数据
1 | css复制代码{"a":1,"b":1} |
若JSON文件中有中文,建议加上encoding参数,赋值’utf-8’,否则会报错
read_html 函数
参数 | 中文释义 |
---|---|
io | 接收网址、文件、字符串。网址不接受https,尝试去掉s后爬去 |
match | 正则表达式,返回与正则表达式匹配的表格 |
flavor | 解析器默认为‘lxml’ |
header | 指定列标题所在的行,list为多重索引 |
index_col | 指定行标题对应的列,list为多重索引 |
skiprows | 跳过第n行(序列标示)或跳过n行(整数标示) |
attrs | 属性,比如 attrs = {‘id’: ‘table’} |
parse_dates | 解析日期 |
使用方法,在网页中右键如果发现表格 也就是 table 即可使用
例如: data.stcn.com/2019/0304/1…
1 | xml复制代码<table class="..." id="..."> |
常见BUG
出现如下报错 ImportError: html5lib not found, please install it
安装html5lib即可,或者使用参数
1 | ini复制代码import pandas as pd |
更多参考源码,可以参考 > pandas.pydata.org/pandas-docs…
pandas 的读写函数简表
读取函数 | 写入函数 | 解释 |
---|---|---|
read_clipboard | to_clipboard | 从剪贴板中读取文本并传递给read_table |
read_csv | to_csv | 将CSV(逗号分隔)文件读入DataFrame |
read_excel | to_excel | Excel表格 |
read_sql | to_sql | |
read_pickle | to_pickle | |
read_json | to_json | |
read_msgpack | to_msgpack | |
read_stata | to_stata | |
read_gbq | to_gbq | 从Google BigQuery加载数据 |
read_hdf | to_hdf | |
read_html | to_html | |
read_parquet | to_parquet | |
read_feather | to_feather |
1 | python复制代码import pandas as pd |
从TXT文件读取部分数据
1 | bash复制代码 1 print(csvframe2, "\n-----*-----") |
另外一项既有趣又很常用的操作是切分想要解析的文本,然后遍历各个部分,逐一对其执行 某一特定操作。
例如,对于一列数字,每隔两行取一个累加起来,最后把和插人到Series对象中„这个小例 子理解起来很简单,
也没有实际应用价值,但是一旦领会了其原理,你就能将其用到更加复杂的情况。
1 | ini复制代码 1 csvframe1 = pd.read_table('pandas_data_test\myCSV_01.csv',sep=',') |
往CSV文件写入数据
1 | python复制代码 1 print(csvframe1) |
进入文件夹我们可以看到相应的文件:
读写HTML文件
1 | less复制代码 1 frame = pd.DataFrame(np.arange(4).reshape(2,2)) |
从XML读取数据
pandas的所有I/O API函数中,没有专门用来处理XML(可扩展标记语言)格式的。虽然没有, 但这种格式其实
很重要,因为很多结构化数据都是以XML格式存储的。pandas没有专门的处理函 数也没关系,因为Python
有很多读写XML格式数据的库(除了pandas)。其中一个库叫作lxml,它在大文件处理方面性能优异,因而从
众多同类库之中脱颖而出。这 一节将介绍如何用它处理XML文件,以及如何把它和pandas整合起来,以最
终从XML文件中获 取到所需数据并将其转换为DataFrame对象。
XML源文件如下图所示
1 | scss复制代码 1 from lxml import objectify |
读写 Microsoft Excel文件
read_excel()、to_excel(),能够读取.xls和.xlsx两种类型的文件。
读写JSON数据
read_json()、to_json()
HDF5格式
至此,已学习了文本格式的读写。若要分析大量数据,最好使用二进制格式。Python有多 种二进制数据处理
工具。HDF5库在这个方面取得了一定的成功。HDF代表等级数据格式(hierarchical data format )。HDF5
库关注的是HDF5文件的读写,这种文件的数据结构由节点组成,能够存储大量数据集。该库全部用c语言
开发,提供了python/matlab和Java语言接口。它的迅速扩展得益于开发人 员的广泛使用,还得益于它的效
率,尤其是使用这种格式存储大量数据,其效率很高。比起其他处理起二进制数据更为简单的格式,HDF5
支持实时压缩,因而能够利用数据结构中的重复模式压缩文件。目前,Python提供两种操纵HDF5格式数据
的方法:PyTables和h5py。这两种方法有几点不同,选用哪一种很大程度上取决于具体需求。
h5py为HDF5的高级API提供接口。PyTables封装了很多HDF5细节,提供更加灵活的数据容器、索引表、搜索
功能和其他计算相关的介质。pandas还有一个叫作HDFStore、类似于diet的类,它用PyTables存储pandas
对象。使用HDF5格式之前,必须导人HDFStore类。
1 | scss复制代码 1 from pandas.io.pytables import HDFStore |
实现对象序列化
****pickle模块实现了一个强大的算法,能够对用Python实现的数据结构进行序列化(pickling) 和反序列化操作。
序列化是指把对象的层级结构转换为字节流的过程。序列化便于对象的传输、存储和重建,仅用接收器就能重
建对象,还能保留它的所有原始特征。
用pandas库实现对象序列化(反序列化)很方便,所有工具都是现成的,无需在Python会话中导入cPickle模
块,所有的操作都是隐式进行的。 pandas的序列化格式并不是完全使用ASCII编码。
1 | scss复制代码 1 import pickle |
对接数据库
****在很多应用中,所使用的数据来自于文本文件的很少,因为文本文件不是存储数据最有效的方式。
数据往往存储于SQL类关系型数据库,作为补充,NoSQL数据库近来也已流行开来。
从SQL数据库加载数据,将其转换为DataFrame对象很简单pandas提供的几个函数简化了该过程。
pandas.io.sql模块提供独立于数据库、叫作sqlalchemy的统一接口。该接口简化了连接模式, 不管对于
什么类型的数据库,操作命令都只有一套。连接数据库使用create_engine()函数,你可以用它配置驱动器所
需的用户名、密码、端口和数据库实例等所有属性。 数据库URL的典型形式是:
dialect+driver://username:password@host:port/database
名称的标识名称,例如sqlite,mysql,postgresql,oracle,或mssql。drivername是用于使用全小写字母连接
到数据库的DBAPI的名称。如果未指定,则将导入“默认”DBAPI(如果可用) - 此默认值通常是该后端可用的
最广泛的驱动程序。
1 | ini复制代码 1 from sqlalchemy import create_engine |
SQLite:
由于SQLite连接到本地文件,因此URL格式略有不同。URL的“文件”部分是数据库的文件名。
对于相对文件路径,这需要三个斜杠:engine = create_engine(‘sqlite:///foo.db’)
****对于绝对文件路径,三个斜杠后面是绝对路径:
Unix/Mac - 4 initial slashes in total
engine = create_engine(‘sqlite:absolute/path/to/foo.db’)
**Windows
engine = create_engine(‘sqlite:///C:\path\to\foo.db’)
Windows alternative using raw string
engine = create_engine(r’sqlite:///C:\path\to\foo.db’)
SQLite3数据读写
****学习使用Python内置的SQLite数据库sqlite3。SQLite3工具实现了简单、 轻量级的DBMS SQL,
因此可以内置于用Python语言实现的任何应用。它很实用,你可以在单个文件中创建一个嵌入式数据库。
若想使用数据库的所有功能而又不想安装真正的数据库,这个工具就是最佳选择。若想在使用真正
的数据库之前练习数据库操作,或在单一程序中使用数据库存储数据而无需考虑接口, SQLite3都是不
错的选择。
1 | python复制代码 1 from sqlalchemy import create_engine |
运行结果:
本文转载自: 掘金