pandas 读取所有表头_数据科学 | pandas数据导入与导出

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第1张图片

作者:杨士锦 周岩 书生

编者按

当我们开始着手做一个数据分析项目时,选择和导入数据集是第一个步骤,而导出数据虽然非必需,但有时候我们也需要保存处理或者分析后的结果,方便下次使用。在pandas中,它已经为我们提供了很多不同格式数据的导入和导出方法,下面这篇文章将具体介绍一些较为常用的方法,包括excel、csv文件以及数据库的导入导出等。

数据导入和导出是pandas中很基础且重要的一个部分。pandas提供了很多不同格式数据的导入和导出方法,可以将其他格式数据转为DataFrame格式。我们可以将list、dict格式数据转为DataFrame格式,也可以从本地的csv、json等文本格式数据和sql、MongoDB等数据库中读取和保存数据等等。下面就分别以三大类介绍一些常见的数据格式的导入与导出。

下文中所有的示例代码都是在jupyter notebook中创作,还不太了解jupyter的小伙伴,可以先看看这篇文章哦:数据科学 | 始于Jupyter Notebooks:一份全面的初学者使用指南。

1 list、dict、np.array 格式数据

1.1 list

一般读取一个list,生成的结果如下:

c01afc2b27c494b3f2365d6ad8813f62.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第2张图片

如果读取的list中的每个元素都是一个元组,会发生什么呢?

8254235178ab92e4485eb5943bf27c7c.png

运行结果:

3bd9d3d083e5f566507d99c21164179f.png

如果忽略columns的话,第二个list的值不是列名,而是默认生成索引名,如下:

3bd9d3d083e5f566507d99c21164179f.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第3张图片

1.2 dict

这里我们以一个字典为数据,看下不同操作的结果有何不同。

4f1dc5ab18f9aa007bcd4f0ef479e203.png

直接调用DataFrame进行读取的话,生成的DataFrame结构如下:

02b358481e0346a181bc1aa741517755.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第4张图片

需要说明的是:from_dict这个方法只有在pandas 0.23版本后才有,如果在早期的版本如0.19中调用会出现报错。

如果我们想以a,b作为索引,以list中的每个值分别为一列怎么操作呢?

7280bd000bf2685e1f4cb3f53e794035.png

运行结果:

538f0f3620a7a32bee81399c285fbe9d.png

如果进一步想让a、b生成列的话,调用reset_index方法即可。

df389215d4e8f33a9252c9bae4ac3a36.png

运行结果:

7e9b2b3187458bad155956a8dad4dbeb.png

但是如果我们想把字典的key和value分别生成两列,如何操作呢?

一种方法是:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第5张图片

还有一种方法依然是利用from_dict,不过就需要将value中的list提前转化成字符串,然后再进行操作即可。

1.3 np.array

numpy是比pandas更底层一些的数据操作工具,pandas的很多操作也是基于numpy进行的,比如numpy就支持直接读取txt文件。比如有这样一个txt文件:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第6张图片

一共有4行8列的数据,数据间用空格隔开,表头带有%,那么读取的时候可以用loadtxt函数进行导入:

ef2d7d5089a763ebe4b054c2a642e4df.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第7张图片

可以看到数据自动剔除了表头,并且只用了其中指定的列。接下来就可以将array导入到pandas中:

e5d1059459e79abfe67c8b90187c3b86.png

我们就可以得到类似用list构建DataFrame的效果了:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第8张图片

1.4 其他方式

当然需要导入文本并不规则的时候,可以考虑直接利用python中的文件读取来一行一行的读取文件,然后利用json或者re等字符串处理包来处理数据,最后整合成DataFrame:

fa9ac03bbbbd6282a23e518c6ec45dc9.png

当然这个方法要结合具体的数据来看,这里就不展开介绍了。

2 文本格式数据

2.1 CSV文件

2.1.1 导入csv数据

常用参数解析:

381190cd0520e06e8558bc656adaad55.png

● filepath_or buffer: str, path object or file-like object。指定传入的文件路径,必须传入的参数。

● sep: str。指定分隔符,默认是逗号分隔符。

● header: int, list or int。指定行数用来作为列名。默认是如果没有传入names参数,则header=0,用第一行作为列名,否则header=None,以传入的names作为列名。另外如果传入的是list,例如[0,1,3],则是以第1、2、4这些行作为多级列名,且中间的行,第3行会被忽略,数据从第5行开始。

● names: array-like, optional。指定文件的列名。如果文件中没有标题行,建议传入此参数。

● index_col: int, str, or sequence of int / str, or False。指定文件的索引,默认为None。

ex1.csv内容如下:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第9张图片

导入ex1.csv

816ef61b3b9df0c5139d870b38c47e01.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第10张图片

ex2.csv文件没有标题行

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第11张图片

设置sep和header参数,导入ex2.csv

2b4b53758e78ea06581a440bec9e858f.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第12张图片

设置sep和names参数,此时header默认为None

f4cbb2f25979b819b6dc7444c92c7ac7.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第13张图片

对ex1.csv设置多级标题,将第1、2、4行作为标题,数据从第5行开始

91f24ce5e878810740a663a95143a2b5.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第14张图片

导入ex1.csv,指定索引为message一列

3b8a5ebbc4074dc8ef2e41df58ba7053.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第15张图片

导入ex1.csv,指定第1和2列作为多重索引

567cb93c1b4f7780a493194e6b8ad649.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第16张图片

2.1.2 导出csv数据

参用参数解析:

a5ddb985f842542f825ae409d5839a77.png

● path_or_buf: str or file handle。指定保存文件路径,必须传入的参数,默认为None。

● index: bool。导出的csv是否包含索引,默认为True。

● header: bool or list of str。导出的csv是否包含标题行,默认为True。

● sep: str。指定导出的csv文件的分隔符,默认为逗号分隔符。

● encoding: str。指定导出的csv文件的编码,默认为utf-8

0d93477580f7581348858d06f23a71de.png

2.2 excel文件

2.2.1 导入excel文件

常用参数解析:

632c813f2c7167c071282849419b04ef.png

read_excel和read_csv的用法差不多,一个需要注意的参数是sheet_name。这个参数是指定读取该excel中具体哪个表的数据,默认为0,即为第一个表。如果传入1,则为第2个表;可指定传入表名,如"Sheet1";也可传入多个表,如[0,'Sheet3'],传入第一个表和名为'Sheet3'的表。

读取ex1.xlsx文件,默认为读取第一个表

6729434c2702ee79863c83f996a2213f.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第17张图片

读取ex1.xlsx文件的第2个表

150cfd5af7f59700e7e993fcd298ec60.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第18张图片

读取ex1.xlsx文件的第2个表和名为"Sheet3"的表,返回的是对象是OrderedDict。OrderedDict是dict的子类,与dict不同的是,它记住了内容的顺序。

9f57f200439544b03a4cfc8d9df0cce3.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第19张图片

在这个orderedDict中,有两个key。第一个key是1,对应的value为该表的内容;第二个key是'Sheet3',对应的value是Sheet3表格的内容。我们选取key,就能得到相应的value。

369af3d2fd07af9cc016d635fa4224e5.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第20张图片

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第21张图片

2.2.2 导出excel文件

常用参数解析:

1ac57d0025a8af55d0a6bad9d5f65c58.webp

● excel_writer: str。指定保存文件路径。

● sheet_name: str。指定excel文件的表名,默认为’Sheet1‘。

● index:bool。是否保存索引,默认为True。

8f104cbf5814ee02d965d8cc1541f71c.png

2.3 txt文件

2.3.1 导入txt文件

常用参数解析:

5ffeeea733efad0e3c4fc6dc54755513.png

read_table与read_csv的唯一区别是,read_csv默认的sep参数是逗号分隔符,而read_table默认是't',制表符。所以这两个方法是通用的,只要设置好分隔符,都可以读取csv和txt文件。

ex3.txt文件的内容如下:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第22张图片

导入ex3.txt文件

fc9d8339182dd87c8ac32bde658b600d.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第23张图片

将sep参数设置为逗号,同样能读取ex1.csv文件

f1af7c560d5451fbcfdbba5f206b2940.webp

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第24张图片

2.3.2 导出txt文件

使用to_csv的方法

cb37d82893cd19d88ade53ff9bc906bc.png

2.4 csv和xlsx的选择

当我们可以选择保存为csv或者xlsx格式,方便下次可以使用的时候,是选择保存为csv还是excel呢?除了考虑csv和excel文件大小之外(相同的数据下excel文件比csv文件小),这里可以考虑下read_csv和read_xlsx的性能问题。在stackoverflow上有人对这两种导入方法进行了一个简单的测试。

测试文件:同样的数据集(分别是320MB的csv文件和16MB的xlsx文件)

电脑硬件:i7-7700k,SSD

python环境:Anaconda Python 3.5.3, pandas 0.19.2

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第25张图片

2.5 json

2.5.1 导入json文件

常用参数解析:

7dbe21a4a9c6693c8c65b8466bdfb94e.png

● path_or_buf: 指定文件路径,默认为None,必须传入的参数。

●orient: json字符串格式,默认为None。这里有split,records,index,columns,values五种选择可选。

● typ: 要转换为series还是dataframe,默认为frame。当typ=frame时,orient可选split/records/index,默认为columns;当typ=series,orient可选split/records/index/columns/value,orient默认为index。

split格式:dict like {index -> [index], columns -> [columns], data -> [values]}, 例如下面的ex4.json文件。

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第26张图片

导入ex4.json

17cc1976a22f05f452b8b58839f9d07c.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第27张图片

records格式:list like [{column -> value}, ..., {column -> value}],例如下面的ex5.json文件。

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第28张图片

导入ex5.json

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第29张图片

导入ex5.json

3f55c0c4d452dd54f48d0706143f6b52.png

运行结果同上。

如果是转为series格式:

70fb2149159d15fefdd9f700d8f47a40.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第30张图片

index格式: dict like {index -> {column -> vlaue}},例如下面的ex6.json文件。

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第31张图片

导入ex6.json

1e0731f2b8434aba62aec2b4070d9f3a.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第32张图片

如果是转为series格式:

fcc5788b3ed5e35f19dcd002f82b77ff.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第33张图片

columns格式:dict like {column -> {index -> value}},例如下面的ex7.json文件。当typ='frame'时,orient默认为这个格式。

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第34张图片

导入ex7.json

e7976d652a787c4bc58c37b4617f549e.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第35张图片

用columns格式读取ex6.json,其实与index格式的结果是行列的转置。

48373be68eef3b7b5fbd1c3c6dd7e513.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第36张图片

values格式:just the values array,例如下面的ex8.json文件。

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第37张图片

导入ex8.json

d7f43d0b8c2c5a95f9085658708ab866.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第38张图片

2.5.2 导出json文件

常用参数解析:

690a9384f53e819c6c96944271299255.png

● orient: string。指定导出json的格式。DataFrame默认是columns,Series默认是index

dataframe导出json,命名为out_ex4.json

880535a06040b32e0d6ce9ecc2801d48.png

series导出json,命名为out_ex5.json

3aca0f025cacb634f3fa67275aa8f4f9.png

3 数据库

3.1 MySQL

在开始之前,请确保环境中的python为3.x版本,且已经安装并开启mysql服务。这里我们使用pymysql库来连接mysql。首先需要通过pip安装pymysql。安装后,可以通过import语句检验是否已经安装成功。如果没有报错,则说明安装成功。

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第39张图片

3.1.1 数据导入mysql

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第40张图片

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第41张图片

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第42张图片

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第43张图片

3.1.2 读取mysql数据

通过sql语句查询数据

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第44张图片

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第45张图片

将结果转换为Dataframe格式

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第46张图片

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第47张图片

关闭数据库连接:

ef4b5659bb3a941ceafbd5bbfa731ce4.png

b4be16c9cd94dbe8018cc1c1caec0bee.png

3.2 PostgreSQL

psycopg2是Python语言的PostgreSQL数据库接口之一,这里我们使用psycopg2连接,首先同样请确保环境中已经安装postgreSQL,以及已通过pip安装psycopg2了。

3.2.1 读取postgreSQL的数据

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第48张图片

2aac9019bbc95fda45c58e696f5b60cc.png

返回的data结果是一个以各行数据为元组的列表,如下:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第49张图片

可以通过pandas对data进行进一步处理:pd.DataFrame(data)。

在insert的时候,需要注意以下几点:

1.表中的字段不需要加引号;

2.插入的每行数值用括号包围,其中各个字段以逗号间隔,字符串型必须加引号;

3.以上sql命令可见,一条sql命令可以插入多条数据,只需要连接各个数据,最终commit一次就好;

4.另外在写入PG的时候,应该注意PG中的数据如果出现单引号“ ' ”会出现错误,所以必须先使用replace替换成其他的内容方可写入。

3.2.2 数据写入postgreSQL

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第50张图片

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第51张图片

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第52张图片

3.3 支持多种数据库 — SQLAlchemy

SQLAlchemy是python下的一款数据库对象关系映射工具(ORM工具),能满足大多数数据库操作需求,且支持多种数据库引擎,能连接上文提及的MySQL, PostgreSQL, Oracle之外,还支持Mircosoft SQL Server, SQLite等的数据库。另外在pandas中,配合使用SQLalchemy连接数据库,可以实现更简便高效的查询和导入数据的操作,因为pandas已经帮你写好一些常用的方法了。

下面我们以连接mysql数据库为例子介绍用法,首先还是需要先通过pip安装sqlalchemy和pymysql。

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第53张图片

3.3.1 读取数据库数据

在pandas中,我们可以通过read_sql_table和read_sql的方法来读取数据库,pandas会帮我们将结果直接转为Dataframe的格式,这对于需要Dataframe格式数据的来说是非常方便的。

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第54张图片

读取数据下现有所有的表

61fef45d091c409a277971d82b3f0929.png

运行结果:

3a84222105971e6ba89a2b0751dd746f.png

读取数据库下某个表的数据

3cb1bbc772104e9f8b05d6365c29090a.png

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第55张图片

根据sql语句查询数据:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第56张图片

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第57张图片

3.3.2 数据导入数据库

将Dataframe格式的数据导入到数据库中,我们可以使用to_sql的方法。

372d4a1ada6d8b6f16dd1b07a3755815.png

● name:导入库的表的名字

● if_exists:默认为"fail",表示如果表不存在,直接报错;可选"replace",导入的Dataframe直接覆盖该表;可选"append",将数据添加到表的后面。

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第58张图片

3.4 MongoDB

MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。这里我们使用PyMongo连接MongoDB数据库。

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第59张图片

3.4.1 将数据导入数据库

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第60张图片

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第61张图片

3.4.2 读取数据库数据

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第62张图片

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第63张图片

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第64张图片

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第65张图片

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第66张图片

运行结果:

pandas 读取所有表头_数据科学 | pandas数据导入与导出_第67张图片

参考文献:

1.《Python for Data Analysis》

2.pandas官方文档:

https://pandas.pydata.org/pandas-docs/stable/index.html

3.https://stackoverflow.com/questions/31362573/performance-difference-in-pandas-read-table-vs-read-csv-vs-from-csv-vs-read-e

4.https://www.runoob.com/python3/python3-mysql.html

5.https://www.runoob.com/python3/python-mongodb.html

你可能感兴趣的:(pandas,读取所有表头,pb,如何导出csv,sklearn导入csv文件)