pandas 读取文件官方提供的文档
在使用 pandas 读取文件之前, 必备的内容, 必然属于官方文档, 官方文档查阅地址
文档操作属于 pandas 里面的 Input/Output 也就是 IO 操作, 基本的 API 都在上述网址, 接下来本文核心带你理解部分常用的命令
pandas 读取 txt 文件
读取 txt 文件需要确定 txt 文件是否符合基本的格式, 也就是是否存在 \ t,` ,,` 等特殊的分隔符
一般 txt 文件长成这个样子
txt 文件举例
下面的文件为空格间隔
2019-03-22 00:06:24.4463094 中文测试
2019-03-22 00:06:32.4565680 需要编辑 encoding
- 2019-03-22 00:06:32.6835965 ashshsh
- 2017-03-22 00:06:32.8041945 eggg
读取命令采用 read_csv 或者 read_table 都可以
- import pandas as pd
- df = pd.read_table("./test.txt")
- print(df)
- import pandas as pd
- df = pd.read_csv("./test.txt")
- print(df)
但是, 注意, 这个地方读取出来的数据内容为 3 行 1 列的 DataFrame 类型, 并没有按照我们的要求得到 3 行 4 列
- import pandas as pd
- df = pd.read_csv("./test.txt")
- print(type(df))
- print(df.shape)
- <class 'pandas.core.frame.DataFrame'>
- (3, 1)
read_csv 函数
默认: 从文件, URL, 文件新对象中加载带有分隔符的数据, 默认分隔符是逗号.
上述 txt 文档并没有逗号分隔, 所以在读取的时候需要增加 sep 分隔符参数
df = pd.read_csv("./test.txt",sep=' ')
参数说明, 官方 Source :
中文说明以及重点功能案例
参数 | 中文释义 |
---|---|
filepath_or_buffer | 可以是 URL,可用 URL 类型包括:http, ftp, s3 和文件,本地文件读取实例:file://localhost/path/to/table.csv |
sep | str 类型,默认',' 指定分隔符。如果不指定参数,则会尝试使用默认值逗号分隔。分隔符长于一个字符并且不是‘\s+’, 将使用 python 的语法分析器。并且忽略数据中的逗号。正则表达式例子:'\r\t' |
定界符,备选分隔符(如果指定该参数,则 sep 参数失效) 一般不用 | |
True or False 默认 False, 用空格作为分隔符等价于 spe=’\s+’如果该参数被调用,则 delimite 不会起作用 | |
header | 指定第几行作为列名(忽略注解行),如果没有指定列名,默认 header=0; 如果指定了列名 header=None |
names | 指定列名,如果文件中不包含 header 的行,应该 < strong ztid="90" ow="162" oh="17">显性表示 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 | 有如下的操作 < br ztid="150" ow="0" oh="0">1. boolean. True -> 解析索引 < br ztid="151" ow="0" oh="0">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 引擎应用于浮点值的转换器 |
该表格部分参考 博客 https://www.cnblogs.com/datablog/p/6127000.html 感谢博主的翻译, O(∩_∩)O 哈哈~
案例 1
index_col 使用
首先准备一个 txt 文件, 这个文件最大的问题是在每行的末尾多了一个',' , 按照提示解释为, 如果每行末尾都有分隔符, 会出现问题, 但是在实际测试的时候发现需要配合 names 参数, 才可以出现效果
- goof,1,2,3,ddd,
- u,1,3,4,asd,
- as,df,12,33,
编写如下代码
- df = pd.read_csv("./demo.txt",header=None,names=['a','b','c','d','e'])
- print(df)
- df = pd.read_csv("./demo.txt",header=None,index_col=False,names=['a','b','c','d','e'])
- print(df)
其实发现意义还真不是很大, 可能文档并没有表述清楚他的具体作用. 接下来说一下 index_col 的常见用途
在读取文件的时候, 如果不设置 index_col 列索引, 默认会使用从 0 开始的整数索引. 当对表格的某一行或列进行操作之后, 在保存成文件的时候你会发现总是会多一列从 0 开始的列, 如果设置 index_col 参数来设置列索引, 就不会出现这种问题了.
案例 2
converters 设置指定列的处理函数, 可以用 "序号" 也可以使用 "列名" 进行列的指定
- import pandas as pd
- def fun(x):
- return str(x)+"-haha"
- df = pd.read_csv("./test.txt",sep=' ',header=None,index_col=0,converters={3:fun})
- print(type(df))
- print(df.shape)
- print(df)
read_csv 函数过程中常见的问题
有的 IDE 中利用 Pandas 的 read_csv 函数导入数据文件时, 若文件路径或文件名包含中文, 会报错.
解决办法
- import pandas as pd
- #df=pd.read_csv('F:/ 测试文件夹 / 测试数据. txt')
- f=open('F:/ 测试文件夹 / 测试数据. txt')
- df=pd.read_csv(f)
排除某些行 使用 参数 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 函数
读取具有固定宽度列的文件, 例如文件
- id8141 360.242940 149.910199 11950.7
- id1594 444.953632 166.985655 11788.4
- id1849 364.136849 183.628767 11806.2
- id1230 413.836124 184.375703 11916.8
- id1948 502.953953 173.237159 12468.3
read_fwf 命令有 2 个额外的参数可以设置
colspecs :
需要给一个元组列表, 元组列表为半开区间,[from,to) , 默认情况下它会从前 100 行数据进行推断.
例子:
- import pandas as pd
- colspecs = [(0, 6), (8, 20), (21, 33), (34, 43)]
- df = pd.read_fwf('demo.txt', colspecs=colspecs, header=None, index_col=0)
- widths:
直接用一个宽度列表, 可以代替 colspecs 参数
- widths = [6, 14, 13, 10]
- df = pd.read_fwf('demo.txt', widths=widths, header=None)
read_fwf 使用并不是很频繁, 可以参照 学习
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 函数
依旧是官方文档一码当先:
参数 | 中文释义 |
---|---|
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 参考列标签 < br ztid="372" ow="0" oh="0">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'
- import pandas as pd
- s = '{"index":[1,2,3],"columns":["a","b"],"data":[[1,3],[2,5],[6,9]]}'
- df = pd.read_json(s,orient='split')
- orient='records'
成员为字典列表
- import pandas as pd
- s = '[{"a":1,"b":2},{"a":3,"b":4}]'
- df = pd.read_json(s,orient='records')
- orient='index'
以索引为 key, 以列字段构成的字典为键值. 如:
s = '{"0":{"a":1,"b":2},"1":{"a":2,"b":4}}'
orient='columns' 或者 values 自己推断即可
部分中文翻译, 可以参考 GitHub> https://github.com/apachecn/pandas-doc-zh
read_json()常见 BUG
读取 JSON 文件出现 ValueError: Trailing data ,JSON 格式问题
原格式为
{"a":1,"b":1},{"a":2,"b":2}
调整为
[{"a":1,"b":1},{"a":2,"b":2}]
或者使用 lines 参数, 并且 JSON 调整为每行一条数据
- {
- "a":1,"b":1
- }
- {
- "a":2,"b":2
- }
若 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 即可使用
例如: http://data.stcn.com/2019/0304/14899644.shtml
- <table class="..." id="...">
- <thead>
- <tr>
- <th>...</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>...</td>
- </tr>
- <tr>...</tr>
- </tbody>
- </table>
- <table> : 定义表格
- <thead> : 定义表格的页眉
- <tbody> : 定义表格的主体
- <tr> : 定义表格的行
- <th> : 定义表格的表头
- <td> : 定义表格单元
常见 BUG
出现如下报错 ImportError: html5lib not found, please install it
安装 html5lib 即可, 或者使用参数
- import pandas as pd
- df = pd.read_html("http://data.stcn.com/2019/0304/14899644.shtml",flavor ='lxml')
更多参考源码, 可以参考>
尾声
截止到现在, 本篇博客已经完成, 对于 pandas 读取文件, 相信你应该已经有一个深入的理解了. 在 pandas 读取文件的过程中, 最常出现的问题, 就是中文问题与格式问题, 希望当你碰到的时候, 可以完美的解决.
有任何问题, 希望可以在评论区给我回复, 期待和你一起进步, 博客园 - 梦想橡皮擦
来源: https://www.cnblogs.com/happymeng/p/10481293.html