Python中数据加载、存储与文件格式
2017-01-11 15:03
549 查看
摘自《利用Python进行数据分析》—— Wes McKinney
我将大致介绍一下这些函数在将文本数据转换为DataFrame时所用到的一些技术。这些函数的选项可以划分为以下几个大类:
索引:将一个或多个列当作返回的DataFrame处理,以及是否从文件、用户获取列名。
类型推断和数据转换:包括用户定义值的转换、缺失值标记列表等。
日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列。
迭代:支持对大文件进行逐块迭代
不规整数据问题:跳过一些行、页脚、注释或者其他一些不重要的东西(比如有成千上万个逗号隔开的数值数据)。
对于常用的pd.read_csv(),官方给出划分:
对于函数pd.read_csv(),
将JSON字符串转换成Python形式:
将Python对象转换成JSON字符串:
这样导入DataFrame相当繁琐。pandas有一个可以简化该过程的
pickle近建议用于短期存储格式,因为很难保证该格式是永远稳定的。 ↩
SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。 ↩
读写文本格式的数据
pandas中的解析函数:函数 | 说明 |
---|---|
read_csv | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号 |
read_table | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(“\t”) |
read_fwf | 读取定宽列格式的数据(也就是说,没有分隔符) |
read_clipboard | 读取剪贴板中的数据,可以看作read_table的剪贴板版。在将网页转换为表格式时很有用 |
索引:将一个或多个列当作返回的DataFrame处理,以及是否从文件、用户获取列名。
类型推断和数据转换:包括用户定义值的转换、缺失值标记列表等。
日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列。
迭代:支持对大文件进行逐块迭代
不规整数据问题:跳过一些行、页脚、注释或者其他一些不重要的东西(比如有成千上万个逗号隔开的数值数据)。
对于常用的pd.read_csv(),官方给出划分:
类别 | 参数 |
---|---|
Begin | filepath_or_buffer, sep=’,’, delimiter |
Column and Index Location and Names | header, names, idex_col, usecols, squeeze, prefix, mangle_dupe_cols |
General Parsing Configuration | dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows |
NA and Missing Data Handling | na_values, keep_default_na, na_filter, verbose, skip_blank_lines |
Datetime Handling | parse_date, infer_datetime_format, keep_date_col, date_parser, dayfirst |
Iteration | iterator, chunksize |
Quoting, Compression, and File Format | compression, thousands, decimal, lineterminator, quotechar, quating, escapechar, comment, encoding, dialect, tupleize_clos |
Error Handling | error_bad_lines, warn_bad_lines |
Internal | skipfooter, skip_footer, doublequote, delim_whitespace, as_recarray, compact_ints, use_unsigned, low_memory, buffer_lines, memory_map, float_precision |
header=None时pandas分配默认列名,需输入参数
names,然后可以通过
index_col=列名或[列名列名](MultiIndex)将某一列作为索引,当然在values中这列就不存在了。
逐块读取文本文件
如果指向读取几行(避免都去整个文件),通过nrows=行数进行指定即可。姚铸块读取文件,需要设置
chunksize=行数,此时的pd.read_csv()返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代,TextParser还有一个get_chunk方法,可以读取任意大小的块。
将数据写出到文本格式
利用DataFrame的to_csv()方法,可以将数据写到一个文件中。对于Series数据,可以通过
from_csv()读取文件,用
to_csv()输出文件。
JSON数据
JSON(JavaScript Object Notation)1已经成为通过HTTP请求再Web浏览器和其他应用程序之间发送数据的标准格式之一。它是一种比表格型文本格式(如CSV)灵活得多的数据格式。将JSON字符串转换成Python形式:
json.loads()
将Python对象转换成JSON字符串:
json.dumps()
二进制数据格式
为了使用方便,pandas中的每一个对象都有一个用于将数据以pickle形式2保存到磁盘上的save方法:testdf.save(),并且通过
pd.load()将数据都会到Python。
使用HTML和Web API
很多网站都有一些通过JSON或其他数据格式提供数据的公共API。通过Python访问这些API的一个简单易用的办法是requests包。In [142]: import requests In [143]: url = 'http://baidu.com' In [144]: resp = requests.get(url) In [145]: resp Out[145]: <Response [200]> In [152]: resp.text Out[152]: u'<html>\n<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">\n</html>\n'
使用数据库
在许多应用中,数据很少取自文本文件,因为用这种方式存储大量数据很低小。基于SQL的关系型数据库(如SQLServer和MySQL等)使用非常广泛,此外还有一些非SQL(即所谓的NoSQL)型数据库也变得非常流行。将数据从SQL加载到DataFrame的过程很简单,此外pandas还有一些能够简化该过程的函数。例如,我将使用一款嵌入式的SQLite数据库3(通过Python内置的sqlite3驱动器):# 创建数据库连接,创建表 In [153]: import sqlite3 In [154]: query = """CREATE TABLE test( a VARCHAR(20), b VARCHAR(20), c REAL, d INTEGER);""" In [155]: con = sqlite3.connect(':memory:') In [156]: con.execute(query) Out[156]: <sqlite3.Cursor at 0x767cf80> In [157]: con.commit() # 然后插入几行数据 In [158]: data = [('Atlanta', 'Georgia', 1.25, 6), ('Tallahassee', 'Florida', 2.6, 3), ('Sacramento', 'California', 1.7, 5)] In [159]: stmt = "INSERT INTO test VALUES (?, ?, ?, ?)" In [160]: con.executemany(stmt, data) Out[160]: <sqlite3.Cursor at 0x767cce0> In [161]: con.commit() # 从表中选取数据,大部分Python SQL驱动器(PyODBC, psycopg2, MySQLdb, pymssqb等)都会返回一个元组列表 In [162]: cursor = con.execute('select * from test') In [163]: rows = cursor.fetchall() In [164]: rows Out[164]: [(u'Atlanta', u'Georgia', 1.25, 6), (u'Tallahassee', u'Florida', 2.6, 3), (u'Sacramento', u'California', 1.7, 5)] #可以将这个元组列表传给DataFrame构造器,但还需要列名(位于游标的description属性中) In[165]: cursor.description Out[165]: (('a', None, None, None, None, None, None), ('b', None, None, None, None, None, None), ('c', None, None, None, None, None, None), ('d', None, None, None, None, None, None)) In [167]: zip(*cursor.description) Out[167]: [('a', 'b', 'c', 'd'), (None, None, None, None), (None, None, None, None), (None, None, None, None), (None, None, None, None), (None, None, None, None), (None, None, None, None)] In [168]: pd.DataFrame(rows, columns=zip(*cursor.description)[0]) Out[168]: a b c d 0 Atlanta Georgia 1.25 6 1 Tallahassee Florida 2.60 3 2 Sacramento California 1.70 5
这样导入DataFrame相当繁琐。pandas有一个可以简化该过程的
read_sql()函数:
In [169]: import pandas.io.sql as sql In [171]: sql.read_sql('select * from test', con) Out[171]: a b c d 0 Atlanta Georgia 1.25 6 1 Tallahassee Florida 2.60 3 2 Sacramento California 1.70 5之后pandas团队会推出越来越多的json相关函数 ↩
pickle近建议用于短期存储格式,因为很难保证该格式是永远稳定的。 ↩
SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。 ↩
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- 数据库链接字符串查询网站
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定