专栏首页python3深入理解pandas读取excel,tx

深入理解pandas读取excel,tx

pandas读取文件官方提供的文档

在使用pandas读取文件之前,必备的内容,必然属于官方文档,官方文档查阅地址

http://pandas.pydata.org/pandas-docs/version/0.24/reference/io.html

文档操作属于pandas里面的Input/Output也就是IO操作,基本的API都在上述网址,接下来本文核心带你理解部分常用的命令

pandas读取txt文件

读取txt文件需要确定txt文件是否符合基本的格式,也就是是否存在\t,` ,,`等特殊的分隔符 一般txt文件长成这个样子

txt文件举例

下面的文件为空格间隔

1 2019-03-22 00:06:24.4463094 中文测试 
2 2019-03-22 00:06:32.4565680 需要编辑encoding 
3 2019-03-22 00:06:32.6835965 ashshsh 
4 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 : https://github.com/pandas-dev/pandas/blob/v0.24.0/pandas/io/parsers.py#L531-L697

中文说明以及重点功能案例

参数

中文释义

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引擎应用于浮点值的转换器

该表格部分参考 博客 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函数过程中常见的问题

  1. 有的IDE中利用Pandas的read_csv函数导入数据文件时,若文件路径或文件名包含中文,会报错。

解决办法

import pandas as pd
#df=pd.read_csv('F:/测试文件夹/测试数据.txt')
f=open('F:/测试文件夹/测试数据.txt')
df=pd.read_csv(f)
  1. 排除某些行 使用 参数 skiprows.它的功能为排除某一行。 要注意的是:排除前3行是skiprows=3 排除第3行是skiprows=[3]
  2. 对于不规则分隔符,使用正则表达式读取文件 文件中的分隔符采用的是空格,那么我们只需要设置sep=" "来读取文件就可以了。当分隔符并不是单个的空格,也许有的是一个空格有的是多个空格时,如果这个时候还是采用sep=" "来读取文件,也许你就会得到一个很奇怪的数据,因为它会将空格也做为数据。 data = pd.read_csv("data.txt",sep="\s+")
  3. 读取的文件中如果出现中文编码错误 需要设定 encoding 参数
  4. 为行和列添加索引 用参数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 使用并不是很频繁,可以参照 http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#files-with-fixed-width-columns 学习

read_msgpack 函数

pandas支持的一种新的可序列化的数据格式,这是一种轻量级的可移植二进制格式,类似于二进制JSON,这种数据空间利用率高,在写入(序列化)和读取(反序列化)方面都提供了良好的性能。

read_clipboard 函数

读取剪贴板中的数据,可以看作read_table的剪贴板版本。在将网页转换为表格时很有用

这个地方出现如下的BUG

module 'pandas' has no attribute 'compat'

我更新了一下pandas 既可以正常使用了

还有一个比较坑的地方,就是在读取剪切板的时候,如果复制了中文,很容易读取不到数据 解决办法

  1. 打开site-packages\pandas\io\clipboard.py 这个文件需要自行检索
  2. 在 text = clipboard_get() 后面一行 加入这句: text = text.decode('UTF-8')
  3. 保存,然后就可以使用了

read_excel 函数

依旧是官方文档一码当先:http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html#pandas.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参考列标签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

  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')
  1. orient='records' 成员为字典列表
import pandas as pd
s = '[{"a":1,"b":2},{"a":3,"b":4}]'
df = pd.read_json(s,orient='records')
  1. orient='index' 以索引为key,以列字段构成的字典为键值。如: s = '{"0":{"a":1,"b":2},"1":{"a":2,"b":4}}'
  2. 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')

更多参考源码,可以参考 > http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html

尾声

截止到现在,本篇博客已经完成,对于pandas读取文件,相信你应该已经有一个深入的理解了。在pandas读取文件的过程中,最常出现的问题,就是中文问题与格式问题,希望当你碰到的时候,可以完美的解决。

有任何问题,希望可以在评论区给我回复,期待和你一起进步,博客园-梦想橡皮擦

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 科学计算库Numpy——数值计算

    py3study
  • eclipse + JBoss 5 +

    有时客户端程序(如JSP、Servlet)会和EJB组件运行在同一个JVM上,如在同一个J2EE服务器(JBoss、Weblogic等)中运行。这时就没必要 再...

    py3study
  • 解决在jupyter notebook中

    昨天学习pandas和matplotlib的过程中, 在jupyter notebook遇到ImportError: matplotlib is require...

    py3study
  • 深入理解pandas读取excel,txt,csv文件等命令

    文档操作属于pandas里面的Input/Output也就是IO操作,基本的API都在上述网址,接下来本文核心带你理解部分常用的命令

    梦想橡皮擦
  • 数据分析之Pandas合并操作总结

    可以看到这个索引就是0和1,如果你直接append而不加参数则就会直接将上面的DataFrame直接和df_append粘在一起而不会改变索引,那么怎么改变索引...

    Datawhale
  • Android获取热点主机ip和连接热点手机ip的代码

    以上所述是小编给大家介绍的Android获取热点主机ip和连接热点手机ip的方法 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此...

    砸漏
  • Android 得到连接热点的ip的方法

    其中IPAddress 是本机的IP地址,serverAddress 是你所连接的wifi热点对应的IP地址

    砸漏
  • Python+matplotlib绘制尼哥米德蚌线

    有一条定直线m,直线外一个定点O。定点与定直线的距离为a。过定点O作一条直线n与定直线m交于点P。在直线n上点P的两侧分别取到点P的距离为b的点Q和点Q'。那么...

    Python小屋屋主
  • 学界 | 超越 BERT 和 GPT,微软亚洲研究院开源新模型 MASS!

    AI 科技评论按:自 2018 年以来,预训练无疑是自然语言处理(NLP)领域中最热门的研究课题之一。通过利用 BERT、GPT 和 XLNet 等通用语言模型...

    AI科技评论
  • 从bgsave命令看redis的RDB持久化机制

    redis通过bgSave命令将数据持久化到磁盘上,在启动的时候,可以从磁盘上加载bgSave生成的RDB文件,恢复数据

    爬蜥

扫码关注云+社区

领取腾讯云代金券