6 数据加载、存储与文件格式
6.1 读写文本格式的数据
pandas提供了一些从文本都去为DataFrame对象的函数,常用的包括read_csv
或read_table
。1
2
3df = pd.read_csv('..\\..\\public\\pydata-book-master\\ch06\\ex1.csv')
df
pd.read_table('..\\..\\public\\pydata-book-master\\ch06\\ex1.csv')
Output:1
2
3
4 a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
对于没有标题行的数据文件可以设置header=None
参数分配默认列名,或通过names
参数自定义列名。另外index_col
参数可以将制定的数据列做成DataFrame的索引。1
2names = ['a','b','c','d','message']
pd.read_csv('..\\..\\public\\pydata-book-master\\ch06\\ex2.csv', names=names, index_col='message')
Output:1
2
3
4
5 a b c d
message
hello 1 2 3 4
world 5 6 7 8
foo 9 10 11 12
另外pandas在导入时还能够通过正则表达式处理异性结构文件和特定分隔符导入,针对缺失值的标记NA,这些在实际使用时不太会碰到,因此可以碰到时在研究解决方案。
逐块读取文本文件
如果只读取几行或逐行读取,可以设置nrows
参数或chunksize
(行数)参数。1
2
3pd.read_csv("..\\..\\public\\pydata-book-master\\ch06\\ex6.csv", nrows=5)
chunker = pd.read_csv("..\\..\\public\\pydata-book-master\\ch06\\ex6.csv", chunksize=1000)
chunker
Output:1
2
3
4
5
6
7
8 one two three four key
0 0.467976 -0.038649 -0.295344 -1.824726 L
1 -0.358893 1.404453 0.704965 -0.200638 B
2 -0.501840 0.659254 -0.421691 -0.057688 G
3 0.204886 1.074134 1.388361 -0.982404 R
4 0.354628 -0.133116 0.283763 -0.837063 Q
<pandas.io.parsers.TextFileReader at 0x6afca70>
read_csv
返回的这个TextFileReader
对象可以根据chunksize的大小对文件进行逐块迭代,例如说需要对ex6.csv
数据聚合到key
列,可以如下编码:1
2
3
4
5tot = Series([])
for piece in chunker:
tot = tot.add(piece['key'].value_counts(), fill_value=0)
tot = tot.order(ascending=False)
tot[:10]
Output:1
2
3
4
5
6
7
8
9
10
11E 368
X 364
L 346
O 343
Q 340
M 338
J 337
F 335
K 334
H 330
dtype: float64
将数据写到文本格式
DataFrame和Series都有to_csv
方法,用于将数据写到一个以逗号分隔的文本文件,输出时可以指定分隔符、缺失值表示、是否输出行列标签,并可以指定列顺序。
手工处理分隔符格式
对于异性文件或含有畸形行的文件,可以使用Python内置的csv模块打开,并传递给csv.reader
进行迭代处理。
JSON数据
有许多Python库可以读写JSON数据,例如json
,通过.loads
方法转换成Python对象,.dumps
方法反之。
有一个简单的方法将一组JSON对象转换为DataFrame数据结构:想DataFrame构造器传入一组JSON对象,并选取数据字段的自己。1
2
3
4
5
6
7
8
9
10
11
12obj = """
{"name": "Wes",
"places_lived": ["United States", "Spain", "Germany"],
"pet": null,
"siblings": [{"name": "Scott", "age": 25, "pet": "Zuko"},
{"name": "Katie", "age": 33, "pet": "Cisco"}]
}
"""
import json
result = json.loads(obj)
siblings = DataFrame(result['siblings'], columns=['name','age'])
siblings
Output:1
2
3 name age
0 Scott 25
1 Katie 33
XML和HTML:Web信息收集
对于互联网上的HTML和XML数据,可以先使用urllib2
抓取,然后用lxml
库进行解析处理,这里更多的涉及到XML解析和XPATH技术,不做过多深入。
6.2 二进制数据格式
读取Microsoft Excel文件
pandas的ExcelFile
类支持读取Excel 2003或更高版本中的表格行数据,下述代码直接将工作表中的数据读取到到DataFrame对象中。1
2xls_file = pd.ExcelFile('data.xls')
table = xls_file.parse('Sheet1')
6.3 使用HTML和Web API
使用requests
包模拟HTTP请求,可以获取网站上很多提供数据的公共API,返回的数据是JSON或其他格式,通过之前的几类方法加载到pandas对象中。
6.4 使用数据库
大部分Python SQL驱动器都会返沪一个元祖列表,以SQLite为例。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21import sqlite3
query = """
CREATE TABLE test
(a VARCHAR(20), b VARCHAR(20),
c REAL, d INTEGER
);"""
con = sqlite3.connect(':memory:')
con.execute(query)
con.commit()
data = [('Atlanta', 'Georgia', 1.25, 6),
('Tallahassee', 'Florida', 2.6, 3),
('Sacramento', 'California', 1.7, 5)]
stmt = "INSERT INTO test VALUES(?, ?, ?, ?)"
con.executemany(stmt, data)
con.commit()
cursor = con.execute('select * from test')
rows = cursor.fetchall()
rows
Output:1
2
3[(u'Atlanta', u'Georgia', 1.25, 6),
(u'Tallahassee', u'Florida', 2.6, 3),
(u'Sacramento', u'California', 1.7, 5)]
pandas有一个简化导入的方法read_frame
函数,传入select语句就能转化成相应的DataFrame对象。1
2import pandas.io.sql as sql
sql.read_frame('select * from test', con)
Output:1
2
3
4 a b c d
0 Atlanta Georgia 1.25 6
1 Tallahassee Florida 2.60 3
2 Sacramento California 1.70 5
存取MongoDB中的数据