pandas之所以能成为Python数据分析领域的事实标准库,是因为它对日常数据分析的便捷操作和全面覆盖。这部分内容主要讲解通过pandas读取不同类型文件的数据、将数据表保存成不同类型的文件,以及如何通过识别和创建行、列来操作数据。
1.pandas支持读写的数据格式
从常见的Excel和CSV到JSON及各种数据库,pandas支持市面上大部分主流数据数据存储形式。
pandas提供了一组顶层的I/O API,如pandas.read_csv()等方法,这些方法可以将众多格式的数据读取到DataFrame数据结构中,经过分析处理后,还可以通过类似DataFrame.to_csv()的方法导出数据。
格式 | 文件格式 | 读取函数 | 输出文件函数 |
binary | Excel | read_excel | to_excel |
text | CSV | read_csv、read_table | to_csv |
text | JSON | read_json | to_json |
text | 网页HTML表格 | read_html | to_html |
text | 本地剪切板 | read_clipboard | to_clipboard |
SQL | SQL查询数据库 | read_sql | to_sql |
text | Markdown | to_markdown |
读取方法一般类似于这样:
pd.read_csv(‘data.csv’) # 如果文件与代码文件在同一目录下
pd.read_csv(‘data/my/data.csv’) # 指定目录
pd.read_csv(‘data/my/my.data’) # CSV文件的扩展名不一定是.csv
pd.read_csv(‘网址/GDP-China.csv’) #通过网络链接读取
csv
CSV(Comma-Separated Values)是用逗号分隔值的数据形式,有时也被称为字符分隔值,因为分隔字符也可以不是逗号。
CSV文件的一般文件扩展名为.csv,用制表符号分隔也常用.tsv作为扩展名。
CSV不仅可以使一个实体文件,还可以是字符形式,以便于在网络上传输。
Excel缺点
Excel一般可以将它的使用分为两类,一类是文字或信息的结构化,像排班表、工作日报、客户名单之类,以文字为主,另一类为统计报表,如学生成绩表、销售表等,以数字为核心,pandas主要处理统计报表,当然也可以对文字信息类表格做整理。
Excel在数据分析也有缺点,它无法进行复杂的处理,有时候提供的函数和处理方法无法满足复杂逻辑,
同时Excel无法支持更大的数据量,目前Excel支持的行数上限为1 048 576(2的20次方),列数上限为16 384(2的14次方,列标签为XFD),在数据分析、机器学习操作中往往会超过这个体量。
此外Excel的处理方法无法复用,Excel一般采用设定格式的公式,然后将数据再复制,但这样仍然无法对数据的处理过程进行灵活复用。
最后Excel的自动化也很有限,数据分析要经过一个数据输入、处理、分析和输出的过程,这些都需要由人工来进行操作。
pandas读取Excel时可以指定读取工作簿的哪张工作表,需要在参数中加上sheet_name=’工作簿表名称’
JSON
JSON是互联网上非常通用的轻量级数据交换格式,是HTTP请求中数据的标准格式之一,pandas提供的JSON读取方法在解析网络爬虫数据时,可以吉大的提高效率。
读取方法可以是:pd.read_json(‘data.json’)
pandas可以解析一个JSON字符串,以下是从HTTP服务检测到的 设备信息:
jdata='{"res":{"model":"iPhone","browser":"Safari","version":"604.1"},"status":200}'
pd.read_json(jdata)
'''
res status
browser Safari 200
model iPhone 200
version 604.1 200
'''
pandas还提供了pd.json_normalize(data)方法来读取半结构化的JSON数据
HTML
pd.read_html()函数可以接受HTML字符串、HTML文件、URL,并将HTML中的<table>标签表格数据解析为DataFrame。如返回有多个df的列表,则可以通过索引取第几个。如果夜里面只有一个表格,那么这个列表就只有一个DataFrame。此方法是pandas提供的一个简单实用的实现爬虫功能的方法。
dfs = pd.read_html('https://www.gairuo.com/p/pandas-io')
dfs[0] # 查看第一个df
# 读取网页文件,第一行为表头
dfs = pd.read_html('data.html', header=0)
# 第一列为索引
dfs = pd.read_html(url, index_col=0)
如果一个网页的表格有许多,可以指定元素来获取:
# id='table'的表格,注意这里仍然可能返回多个
dfs1 = pd.read_html(url, attrs={'id': 'table'})
# dfs1[0]
# class='sortable'
dfs2 = pd.read_html(url, attrs={'class': 'sortable'})
其他常用的参数与read_csv基本相同
剪切板
剪切板(Clipboard)是操作系统级的一个暂存数据的地方,它保存在内存中,可以在不同软件之间传递。
Pandas支持读取剪切板中的结构化数据,这就意味着我们不用将数据保存成文件,而可以直接从网页、Excel等文件中复制,然后从操作系统的剪切板中读取,非常方便。
SQL
pandas需要引入SQLAlchemy库来支持SQL,在SQLAlchemy的支持下,它可以实现所有常见数据库类型的查询、更新等操作。pandas连接数据库进行查询和更新的方法如下:
read_sql_table(table_name, con[, schema, …]):把数据表里的数据转换成DataFrame。
read_sql_query(sql, con[, index_col, …]):用sql查询数据到DataFrame中。
read_sql(sql, con[, index_col, …]):同时支持上面两个功能。
DataFrame.to_sql(self, name, con[, schema, …]):把记录数据写到数据库里。
示例:
# 需要安装SQLAlchemy库
from sqlalchemy import create_engine
# 创建数据库对象,SQLite内存模式
engine = create_engine('sqlite:///:memory:')
# 取出表名为data的表数据
with engine.connect() as conn, conn.begin():
data = pd.read_sql_table('data', conn)
# data
# 将数据写入
data.to_sql('data', engine)
# 大量写入
data.to_sql('data_chunked', engine, chunksize=1000)
# 使用SQL查询
pd.read_sql_query('SELECT * FROM data', engine)
更多格式可以在pandas官网(https://pandas.pydata.org/docs/user_guide/io.html)查询。
2.读取CSV
由于CSV文件使用非常频繁、功能强大、参数众多,这里专门用一节来介绍
pd.read_csv()语法
pd.read_csv(filepath_or_buffer: Union[str, pathlib.Path, IO[~AnyStr]],
sep=',', delimiter=None, header='infer', names=None, index_col=None,
usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True,
dtype=None, engine=None, converters=None, true_values=None,
false_values=None, skipinitialspace=False, skiprows=None,
skipfooter=0, nrows=None, na_values=None, keep_default_na=True,
na_filter=True, verbose=False, skip_blank_lines=True,
parse_dates=False, infer_datetime_format=False,
keep_date_col=False, date_parser=None, dayfirst=False,
cache_dates=True, iterator=False, chunksize=None,
compression='infer', thousands=None, decimal: str = '.',
lineterminator=None, quotechar='"', quoting=0,
doublequote=True, escapechar=None, comment=None,
encoding=None, dialect=None, error_bad_lines=True,
warn_bad_lines=True, delim_whitespace=False,
low_memory=True, memory_map=False, float_precision=None)
数据内容 filepath_or_buffer
filepath_or_buffer作为第一个参数,没有默认值也不能为空,根据Python的语法,第一个参数传参时可以不写参数名,可以传文件路径,文件路径支持本地相对路径或绝对路径,CSV文件的扩展名也不需要必须是.csv结尾。
第一个参数也可以传字符串,也就是将一段字符串识别成CSV格式再转换成DataFrame。
from io import StringIO
data = ('col1,col2,col3\n'
'a,b,1\n'
'a,b,2\n'
'c,d,3')
pd.read_csv(StringIO(data))
pd.read_csv(StringIO(data), dtype=object)
也可以传入字节数据:
from io import BytesIO
data = (b'word,length\n'
b'Tr\xc3\xa4umen,7\n'
b'Gr\xc3\xbc\xc3\x9fe,5')
pd.read_csv(BytesIO(data))
分隔符 sep
sep参数是字符类型的,代表每行数据内容的分隔符号,默认是英文逗号,另外常见的还有制表符(\t)、空格等,可以根据数据的实际情况传值:
# 数据分隔符默认是逗号,可以指定为其他符号
pd.read_csv(data, sep='\t') # 制表符分隔tab
pd.read_table(data) # read_table 默认是制表符分隔tab
pd.read_csv(data, sep='|') # 制表符分隔tab
pd.read_csv(data,sep="(?<!a)\|(?!1)", engine='python') # 使用正则表达式
pd.read_csv还提供给了一个参数名为delimiter的定界符,这是一个备选分隔符,是sep的别名,效果和sep一样。如果指定该参数,则sep参数失效。
表头 header
header参数支持支持整形和由整形组成的列表,指定第几行是表头,默认会把第一行当做表头。表头指的是列标签的那一行,也就是将哪一行当做列标签。
pd.read_csv(data, header=0) # 第一行
pd.read_csv(data, header=None) # 没有表头
pd.read_csv(data, header=[0,1,3]) # 多层索引MultiIndex
如果skip_blank_lines=True,header参数将忽略空行和注释行 ,因此header=0表示第一行数据而非文件的第一行。
列名 names
names用来指定列的名称,它是一个类似列表的序列,与数据一一对应,入股文件不包含列名,那么应该设置header=None,列名列表中不允许有重复值。
列名与表头好像是同一种东西,都是指数据表的列标签,但是如果设置了列名,那么列名就会替代掉表头。
如果设置header=1,然后设置列名,因为设置了header=1,原始数据表的索引值为1的行被当成表头,此时列名names又会将表头覆盖,那么DataFrame的内容是从原数据表的第3行开始的。
假如源数据表有5列,但names仅设置了4个列标签,那么最后一个列标签,对应最后一列数据,第一个列标签就要对应2列数据?
这里还是有问题没搞懂,以后再试。
索引 index_col
index_col用来指定索引列,可以使行索引的列编号或者列名,如果给定一个序列,则会有多个行索引。pandas不会自动将第一列作为索引,如果不手动指定索引,那么pandas会自动以0开始的数列作为自然索引。
# 支持int、str、int序列、str序列、False,默认为None
pd.read_csv(data, index_col=False) # 不再使用首列作为索引
pd.read_csv(data, index_col=索引值) # 指定将第几列的内容作为索引
pd.read_csv(data, index_col='列标签') # 指定哪一列作为索引
pd.read_csv(data, index_col=['a','b']) # 多个索引
pd.read_csv(data, index_col=[0, 3]) # 按列索引指定多个索引
使用部分列 usecols
如果只使用数据的部分列,可以用usecols来指定,这样可以加快加载速度并降低内存消耗。
# 支持类似列表的序列和可调用对象
# 读取部分列
pd.read_csv(data, usecols=[0,4,3])
# 按索引只读取指定列,不会改变列的排序,即便只有一个索引,也需要方括号
#也就是说,即便指定索引时,将索引值为4的列放在索引值为3的列的前面,但输出时,索引值为3的列依然会出现在索引值4的列的前面
pd.read_csv(data, usecols=['列1', '列5']) # 按列名,列名必须存在
# 指定列顺序,其实是df的筛选功能,注意圆括号在第一组方括号后就已闭合
pd.read_csv(data, usecols=['列1', '列5'])[['列5', '列1']]
# 以下用callable方式可以巧妙指定顺序,in后面的是我们要的顺序
pd.read_csv(data, usecols=lambda x: x.upper() in ['COL3', 'COL1'])
返回序列 squeeze
将squeeze设置为True,如果文件仅包含一列,会返回一个Series,如果有多列,则还是返回DataFrame。
这个功能好像在未来版本会被放弃?
将squeeze设置为True,如果文件只包含一列,则返回一个Series,如果有多列,则还是返回DataFrame。
# 布尔型,默认为False
# 下例只取一列,会返回一个Series
pd.read_csv(data, usecols=[0], squeeze=True)
# 有两列则还是df
pd.read_csv(data, usecols=[0, 2], squeeze=True)
通过type()函数可以查看对象是Series还是DataFrame
表头前缀 prefix
如果原始数据没有列名,可以指定一个前缀加序数的名称,如n0、n1,通过prefix参数指定前缀。
想要使用prefix参数,该数据表必须没有表头,或者将header参数设置为None。
之后,数据表的列标签,会被改成指定自己指定的字符+从0开始的索引值
df=pd.read_csv('1.csv',prefix='c',header=None)
print(df)
#输出的数据表,每列的列标签以c开头,后面跟着索引值,如c0、c1、c2...
处理重复列名 mangle_dupe_cols
如果该参数为True,当列名有重复时,解析列名将便为X,X.1,…,X.N,
如果该参数为False,那么当列名有重复时,前面的列会被后面的列覆盖
# 布尔型,默认为True
data = 'a,b,a\n0,1,2\n3,4,5'
pd.read_csv(StringIO(data), mangle_dupe_cols=True)
# 表头为a b a.1
# False会报ValueError错误
该功能在未来会被删除,现在没有这个参数,重复的列的列标签,也会以X.1、X.2这样的形式出现。
数据类型 dtype
dtype可以指定各数据列的数据类型
# 传入类型名称,或者以列名为键、以指定类型为值的字典
pd.read_csv(data, dtype=np.float64) # 所有数据均为此数据类型
pd.read_csv(data, dtype={'c1':np.float64, 'c2': str}) # 指定字段的类型
pd.read_csv(data, dtype=[datetime, datetime, str, float]) # 依次指定
引擎 engine
使用分析引擎可以选择C或Python。C语言的速度最快,Python语言的功能最为完善,一般情况下不需要指定。
# 格式为engine=None,其中可选值有{'c', 'python'}
pd.read_csv(data, engine='c')
列数据处理 converters
使用converters参数对列的数据进行转换,参数中指定列名与针对此列的处理函数,最终以字典的形式传入,字典的键可以使列名或者列的序号。
# 字典格式,默认为None
data = 'x,y\na,1\nb,2'
def foo(p):
return p+'s'
# x应用函数,y使用lambda
pd.read_csv(StringIO(data), converters={'x': foo,
'y': lambda x: x*3})
# 使用列索引
pd.read_csv(StringIO(data),
converters={0: foo, 1: lambda x: x*3})
真假值转换 true_values/false_values
使用true_values和false_values将指定的文本内容转换为True或False,可以用列表指定多个值。
# 列表,默认为None
data = ('a,b,c\n1,Yes,2\n3,No,4')
pd.read_csv(StringIO(data),
true_values=['Yes'], false_values=['No'])
(未成功测试)
跳过指定行 skip_rows、skipfooter、skip_blank_lines
跳过需要忽略的行数(从文件开始处算起),或需要忽略的行号列表(从0开始),可以使用skip_rows、skipfooter、skip_blank_lines参数。
用法如下:
skiprows=要跳过的行数 #数字是多少,就跳过多少行
skiprows=range(要跳过的行数)
skiprows=[行索引,行索引,行索引] #填入行索引,指定跳过哪几行
skiprows=lambda x: x % 2 != 0 #隔行跳过skipfooter=1,engine=’python’ #跳过最后一行,需要指定engine=python
skip_blank_lines指定是否跳过空行,默认为True,设置为False则数据标记为Nan
读取指定行数 n_rows
nrows参数用于指定需要读取的行数,从文件的第一行开始算,经常用于在读取较大数据时先读取部分进行代码编写。
nrows=要读取的行数(不包含列表)
也就是说,假如nrows=10,那么会先读取第一行列标签,然后再往下读取10行数据
将指定内容替换为NaN na_values
na_values参数的值是一组用于替换NA/NaN的值。如果传参,需要指定特定列的控制,以下默认会被认定为空值:
[‘-1.#IND’, ‘1.#QNAN’, ‘1.#IND’, ‘-1.#QNAN’,
‘#N/A N/A’, ‘#N/A’, ‘N/A’, ‘n/a’, ‘NA’,
‘#NA’, ‘NULL’, ‘null’, ‘NaN’, ‘-NaN’,
‘nan’, ‘-nan’, ”]
na_values=['字符串',数字] #将指定的内容替换为NaN
注意,这里是指定将什么内容替换成NaN,而不是出现空值后用什么来补,不要弄反了
使用na_values时需要关注下面keep_default_na的配合使用和影响
# 可传入标量、字符串、类似列表序列和字典,默认为None
# 5和5.0会被认为是NaN
pd.read_csv(data, na_values=[5])
# ?会被认为是NaN
pd.read_csv(data, na_values='?')
# 空值为NaN
pd.read_csv(data, keep_default_na=False, na_values=[""])
# 字符NA和字符0会被认为是NaN
pd.read_csv(data, keep_default_na=False, na_values=["NA", "0"])
# Nope会被认为是NaN
pd.read_csv(data, na_values=["Nope"])
# a、b、c均被认为是NaN,等于na_values=['a','b','c']
pd.read_csv(data, na_values='abc')
# 指定列的指定值会被认为是NaN
pd.read_csv(data, na_values={'c':3, 1:[2,5]})
保留默认空值 keep_default_na
分析数据时是否包含默认的NaN值,是否自动识别。如果指定na_values参数,并且keep_default_na=False,那么默认的NaN将被覆盖,否则添加。
keep_default_na和na_values的关系见下表:
keep_default_na | na_values | 逻辑 |
True | 指定 | na_values的配置附加处理 |
True | 未指定 | 自动识别 |
False | 指定 | 使用na_values的配置 |
False | 未指定 | 不作处理 |
如果na_filter为False(默认为True),那么keep_default_na和na_values参数均无效。
# 布尔型,默认为True
# 不自动识别空值
pd.read_csv(data, keep_default_na=False)
na_filter为是否检查丢失空值(空字符串或空值)。对于大文件来说,数据集中没有空值,设定na_filter=False可以提升读取速度。
日期时间解析 date_parser
日期时间解析器参数date_parser用于解析日期的函数,默认使用dateutil.parser.parser来转换。
如果为某些或所有列启用了parse_dates,并且datetime字符串的格式都相同,则通过设置infer_date_format=True,可以大大提高解析速度,pandas将尝试推断datetime字符串的格式,然后使用更快的方法解析字符串,从而将解析速度提高数倍。如果无法对整列做出正确的推断解析,pandas将返回到正常的解析模式。
下面是一些可自动推断的日期时间字符串示例,它们都表示2020年12月30日00:00:00:
“20201230”
“2020/12/30”
“20201230 00:00:00”
“12/30/2020 00:00:00”
“30/Dec/2020 00:00:00”
“30/December/2020 00:00:00”
# 解析时间的函数名,默认为None
# 指定时间解析库,默认是dateutil.parser.parser
date_parser = pd.io.date_converters.parse_date_time
date_parser = lambda x: pd.to_datetime(x, utc=True, format='%d%b%Y')
date_parser = lambda d: pd.datetime.strptime(d, '%d%b%Y')
# 使用
pd.read_csv(data, parse_dates=['年份'], date_parser=date_parser)
parse_dates参数用于对时间日期进行解析。
# 布尔型、整型组成的列表、列表组成的列表或者字典,默认为False
pd.read_csv(data, parse_dates=True) # 自动解析日期时间格式
pd.read_csv(data, parse_dates=['年份']) # 指定日期时间字段进行解析
# 将第1、4列合并解析成名为“时间”的时间类型列
pd.read_csv(data, parse_dates={'时间':[1,4]})
如果infer_datetime_format被设定为True并且parse_dates可用,那么Pandas将尝试转换为日期类型。
# 布尔型,默认为False
pd.read_csv(data, parse_dates=True, infer_datetime_format=True)
如果用上文中的parse_dates参数将多列合并并解析成一个时间列,设置keep_date_col的值为True时,会保留这些原有的时间组成列;如果设置为False,则不保留这些列。
# 布尔型,默认为False
pd.read_csv(data, parse_dates=[[1, 2], [1, 3]], keep_date_col=True)
对于DD/MM格式的日期类型,如日期2020-01-06,如果dayfirst=True,则会转换成2020-06-01。
# 布尔型,默认为False
pd.read_csv(data, dayfirst=True, parse_dates=[0])
cache_dates如果为True,则使用唯一的转换日期缓存来应用datetime转换。解析重复的日期字符串,尤其是带有时区偏移的日期字符串时,可能会大大提高速度。
# 布尔型,默认为True
pd.read_csv(data, cache_dates=False)
文件处理 iterator
以下是一些对读取文件对象的处理方法。iterator参数如果设置为True,则返回一个TextFileReader对象,并可以将它进行迭代,以便逐块处理文件。
#布尔型,默认为False
pd.read_csv(data,iterator=True)
chunksize参数可以指定文件块的大小,分块处理大型CSV文件
# 整型,默认为None
pd.read_csv(data, chunksize=100000)
# 分块处理大文件
df_iterator = pd.read_csv(file, chunksize=50000)
def process_dataframe(df):
pass
return processed_df
for index,df_tmp in enumerate(df_iterator):
df_processed = process_dataframe(df_tmp)
if index > 0:
df_processed.to_csv(path)
else:
df_processed.to_csv(path, mode='a', header=False)
compression(压缩格式)用于对磁盘数据进行及时解压缩,如果为“infer”,且filepath_or_buffer是以.gz、.bz2、,zip或.xz结尾的字符串,则使用gzip、bz2、zip或xz,否则不进行解压缩。
如果使用zip,则ZIP文件必须仅包含一个要读取的数据文件。设置为None将不进行解压缩。
# 可选值有'infer'、'gzip'、'bz2'、'zip'、'xz'和None,默认为'infer'
pd.read_csv('sample.tar.gz', compression='gzip')
encoding(编码)可以指定字符集类型,通常为【utf-8】
# 字符型,默认为None
pd.read_csv('gairuo.csv', encoding='utf8')
pd.read_csv("gairuo.csv",encoding="gb2312") # 常见中文
符号 千分位分隔符thosands、小数点decimal、行结束符lineterminator、引号tuotechar
以下是对文件中的一些数据符号进行的特殊识别处理。
#字符型,默认为None
#设置千分位分隔符thosands
pd.read_csv('x.csv',thosands=',') #逗号分隔
#小数点decimal,识别为小数点的字符
decimal=','
#行结束符lineterminator,将文件分成几行的字符,仅对C解释器有效
# 长度为1的字符串,默认为None
data = 'a,b,c~1,2,3~4,5,6'
pd.read_csv(StringIO(data), lineterminator='~')
#引号tuotechar,用于表示引用数据的开始和结束的字符。
#引用的项目可以包含定界符,它将被忽略
#长度为1的字符串
pd.read_csv(file,quotechar='"')
在csv模块中,数据可能会用引号等字符包裹起来,quoting参数用来控制识别字段的引号模式,它可以是Python csv模块中的csv.QUOTE_*常量,也可以传入对应的数字。各个传入值的意义如下。
0或csv.QUOTE_MINIMAL:仅特殊字段有引号。
1或csv.QUOTE_ALL:所有字段都有引号。
2或csv.QUOTE_NONNUMERIC:所有非数字字段都有引号。
3或csv.QUOTE_NONE:所有字段都没有引号。
如果使用csv模块,则需要事先引入csv模块。
# 整型或者csv.QUOTE_*实例, 默认为0
import csv
pd.read_csv('input_file.csv', quoting=csv.QUOTE_NONE)
双引号doublequote,当单引号已经被定义,并且quoting参数不是QUOTE_NONE的时候,使用双引号表示将引号内的元素作为一个元素使用。
# 布尔型,默认为True
import csv
pd.read_csv('data.csv', quotechar='"', doublequote=True, quoting=csv.QUOTE_NONNUMERIC)
escapechar可以传入一个转义符,用于过滤数据中的该转入符。比如,如果一行用双引号包裹着的数据中有换行符,用以下代码可以过滤其中的换行符。
# 长度为1的转义字符串,默认为None
pd.read_csv(StringIO(data), escapechar='\n', encoding='utf-8')
注释标识comment,指示不应分析行的部分。如果在一行的开头找到该标识,则将完全忽略该行。此参数必须是单个字符。像空行一样(只要skip_blank_lines = True),注释的行将被参数header忽略,而不是被skiprows忽略。例如,如果comment =’#’,则解析header=0的’#empty \ na,b,c \ n1,2,3’会将’a,b,c’视为header。
# 字符串,默认为None
s = '# notes\na,b,c\n# more notes\n1,2,3'
pd.read_csv(StringIO(s), sep=',', comment='#', skiprows=1)
空格分隔符delim_whitespace,指定是否将空格(例如”或’\ t’)用作分隔符,等效于设置sep =’\s+’。如果此选项设置为True,则不应该为delimiter参数传递任何内容。
# 布尔型,默认为False
pd.read_csv(StringIO(data), delim_whitespace=False)
3.读取Excel
pandas.read_excel接口语法如下:
pd.read_excel(io, sheet_name=0, header=0,
names=None, index_col=None,
usecols=None, squeeze=False,
dtype=None, engine=None,
converters=None, true_values=None,
false_values=None, skiprows=None,
nrows=None, na_values=None,
keep_default_na=True, verbose=False,
parse_dates=False, date_parser=None,
thousands=None, comment=None, skipfooter=0,
convert_float=True, mangle_dupe_cols=True, **kwds)
文件内容
io作为第一个参数,没有默认值也不能为空,可以传入本地文件名(路径)或远程文件的URL:
# 字符串、字节、Excel文件、xlrd.Book实例、路径对象或者类似文件的对象
# 本地相对路径
pd.read_excel('data/data.xlsx') # 注意目录层级
pd.read_excel('data.xls') # 如果文件与代码文件在同一目录下
# 本地绝对路径
pd.read_excel('/user/gairuo/data/data.xlsx')
# 使用URL
pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx')
指定读取哪个工作表 sheet_name
sheet_name参数可以指定读取Excel工作簿中的哪张工作表,如果不指定,默认读取第一张(索引值为0)。
# 字符串、整型、列表、None,默认为0
pd.read_excel('tmp.xlsx', sheet_name=1) # 第二个sheet
pd.read_excel('tmp.xlsx', sheet_name='总结表') # 按sheet的名字
# 读取第一个、第二个、名为Sheet5的sheet,返回一个df组成的字典
#df组成的字典中,每张工作表的名字会作为键,对应工作表的内容会以单个DataFrame作为它的值
dfs = pd.read_excel('tmp.xlsx', sheet_name=[0, 1, "Sheet5"])
dfs = pd.read_excel('tmp.xlsx', sheet_name=None) # 所有sheet
dfs['Sheet5'] # 读取时按sheet名
其他参数基本与pandas.read_csv一致
4.数据输出
导出为CSV格式
数据表.to_csv()方法可将DataFrame导出为CSV格式的文件,有2个参数值得注意,index=False可以在导出时不带索引,
还可以使用sep参数指定分隔符,
columns可以指定要导出哪几列,就填写哪几列的列标签,用方括号包起来
如果不需要表头,可以将header设为False。如果文件较大,可以使用compression进行压缩:
# 创建一个包含out.csv的压缩文件out.zip
compression_opts = dict(method='zip',
archive_name='out.csv')
df.to_csv('out.zip', index=False,
compression=compression_opts)
导出为Excel格式
数据表.to_excel()可以将数据表导出为Excel文件,
sheet_name参数可以指定sheet名,
将index一起导出,index_label参数可以设置index这一列的列标签,值为字符串格式
多个数据导出:
# 将多个df分不同sheet导入一个Excel文件中
with pd.ExcelWriter('path_to_file.xlsx') as writer:
df1.to_excel(writer, sheet_name='Sheet1')
df2.to_excel(writer, sheet_name='Sheet2')
使用指定的Excel导出引擎:
# 指定操作引擎
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', engine='xlsxwriter')
# 在'engine'参数中设置ExcelWriter使用的引擎
writer = pd.ExcelWriter('path_to_file.xlsx', engine='xlsxwriter')
df.to_excel(writer)
writer.save()
# 设置系统引擎
from pandas import options # noqa: E402
options.io.excel.xlsx.writer = 'xlsxwriter'
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1')
其他参数解释:
excel_writer : 字符串或ExcelWriter 对象
文件路径或现有的ExcelWriter
sheet_name :字符串,默认“Sheet1”
将包含DataFrame的表的名称。
na_rep : 字符串,默认‘ ’
缺失数据表示方式
float_format : 字符串,默认None
格式化浮点数的字符串
columns : 序列,可选
要编写的列
header : 布尔或字符串列表,默认为Ture。
写出列名。如果给定字符串列表,则假定它是列名称的别名。
index :布尔,默认的Ture
写行名(索引)
index_label : 字符串或序列,默认为None。
如果需要,可以使用索引列的列标签。如果没有给出,标题和索引为true,则使用索引名称。如果数据文件使用多索引,则需使用序列。
startrow :
左上角的单元格行来转储数据框
startcol :
左上角的单元格列转储数据帧
engine : 字符串,默认没有
使用写引擎 – 您也可以通过选项io.excel.xlsx.writer,io.excel.xls.writer和io.excel.xlsm.writer进行设置。
merge_cells : 布尔,默认为Ture
编码生成的excel文件。 只有xlwt需要,其他编写者本地支持unicode。
inf_rep : 字符串,默认“正”
无穷大的表示(在Excel中不存在无穷大的本地表示)
freeze_panes : 整数的元组(长度2),默认为None。
指定要冻结的基于1的最底部行和最右边的列
导出为HTML
DataFrame.to_html可以将数据表中的数据组装在HTML代码的<table>标签中,输入一个字符串,这部分HTML代码可以放在网页中进行展示,也可以作为邮件正文。
bold_rows=False参数表示表头不加粗
导出为数据库(SQL)
将DataFrame中的数据保存到数据库的对应表中:
# 需要安装SQLAlchemy库
from sqlalchemy import create_engine
# 创建数据库对象,SQLite内存模式
engine = create_engine('sqlite:///:memory:')
# 取出表名为data的表数据
with engine.connect() as conn, conn.begin():
data = pd.read_sql_table('data', conn)
# data
# 将数据写入
data.to_sql('data', engine)
# 大量写入
data.to_sql('data_chunked', engine, chunksize=1000)
# 使用SQL查询
pd.read_sql_query('SELECT * FROM data', engine)
输出为Markdown
Markdown是一种常用的技术文档编写语言,Pandas支持输出Markdown格式的字符串,需要使用print函数查看输出结果
print(df.to_markdown())