Python for Data Analysis III

Posted by Gloomymoon on 2016-11-16

6 数据加载、存储与文件格式

6.1 读写文本格式的数据

pandas提供了一些从文本都去为DataFrame对象的函数,常用的包括read_csvread_table

1
2
3
df = 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
2
names = ['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
3
pd.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
5
tot = 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
11
E    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
12
obj = """
{"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
2
xls_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
21
import 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
2
import 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中的数据