1.将数据写出到文本格式
data1=pd.read_csv('data/ex5.csv')
data1.to_csv('data/out.csv')
当然,还可以使用其他分隔符
data1.to_csv('data/sys.stdout',sep='|')
缺失值在输出结果中会被表示为空字符串,你可能希望将其表示为别的标记值
data1.to_csv('data/sys.stdout',na_rep='NULL')
文本的内容为:
,something,a,b,c,d,message
0,one,1,2,3.0,4,NULL
1,two,5,6,NULL,8,world
2,three,9,10,11.0,12,foo
如果没有设置其它选项,则会写出行和列的标签。当然,它们都可以被禁用
data1.to_csv('data/sys.stdout',index=False,header=False)
文本内容为:
one,1,2,3.0,4,
two,5,6,,8,world
three,9,10,11.0,12,foo
你还可以只写出一部分的列,并以你指定的顺序排列
data1.to_csv('data/sys.stdout',index=False,cols=['a','b','c'])
Series也有一个to_csv方法
dates=pd.date_range('1/1/2000',periods=7)
ts=Series(np.arange(7),index=dates)
ts.to_csv('data/tseries.csv')
文本内容为:
2000/1/1 | 0 |
2000/1/2 | 1 |
2000/1/3 | 2 |
2000/1/4 | 3 |
2000/1/5 | 4 |
2000/1/6 | 5 |
2000/1/7 | 6 |
print Series.from_csv('data/tseries.csv',parse_dates=True)
结果为:
2000-01-01 0
2000-01-02 1
2000-01-03 2
2000-01-04 3
2000-01-05 4
2000-01-06 5
2000-01-07 6
dtype: int64
2.手工处理分隔符格式
import csv
f=open('data/ex7.csv')
reader=csv.reader(f)
for line in reader:
print line
结果为:
['a', 'b', 'c']
['1', '2', '3']
['1', '2', '3', '4']
现在,为了使数据格式合乎要求,你需要对其做一些整理工作
lines=list(csv.reader(open('data/ex7.csv')))
print lines
header,values=lines[0],lines[1:]
data_dict={h:v for h,v in zip(header,zip(*values))}
print data_dict
结果为:
[['a', 'b', 'c'], ['1', '2', '3'], ['1', '2', '3', '4']]
{'a': ('1', '1'), 'c': ('3', '3'), 'b': ('2', '2')}
csv文件的形式有很多。只需定义csv.Dialect的一个子类即可定义出新格式(如专门的分隔符、字符串引用约定、行结束符等)
class my_dialect(csv.Dialect):
lineterminator='\n'
delimiter=';'
quotechar='"'
reader=csv.reader(f,diaect=my_dialect)
各个csv语支的参数也可以关键字的形式提供给csv.reader,而无需定义子类
reader=csv.reader(f,delimiter='|')
可用的选项(csv.Dialect的属性)及其功能如下表
3.JSON数据
通过json.loads即可将JSON字符串转换成Python形式
import json
obj="""
{"name":"Wes",
"places_lived":["United States","Spain","Germany"],
"pet":null,
"siblings":[{"name":"Scott","age":25,"pet":"Zuko"},
{"name":"Katie","age":33,"pet":"Cisco"}]
}
"""
result=json.loads(obj)
print result
结果为:
{u'pet': None, u'siblings': [{u'pet': u'Zuko', u'age': 25, u'name': u'Scott'}, {u'pet': u'Cisco', u'age': 33, u'name': u'Katie'}], u'name': u'Wes', u'places_lived': [u'United States', u'Spain', u'Germany']}
相反,json.dumps则将Python对象转换成JSON格式
print json.dumps(result)
结果为:
{"pet": null, "siblings": [{"pet": "Zuko", "age": 25, "name": "Scott"}, {"pet": "Cisco", "age": 33, "name": "Katie"}], "name": "Wes", "places_lived": ["United States", "Spain", "Germany"]}
如何将JSON对象转化为DataFrame或其他便于分析的数据结构就由你决定。最简单的方式是:向DataFrame构造器中传入一组JSON对象,并选取数据字段的子集
siblings=DataFrame(result['siblings'],columns=['name','age'])
print siblings
结果为:
name age
0 Scott 25
1 Katie 33
4.XML和HTML:Web信息收集
首先,找到希望获取数据的URL,利用urllib2将其打开,然后用lxml解析得到的数据流
from lxml.html import parse
from urllib2 import urlopen
parsed=parse(urlopen('http://finance.yahoo.com/q/op?s=AAPL+Options'))
doc=parsed.getroot()
通过这个对象,你可以获取特定类型的所有HTML标签(tag),假设你想得到该文档中所有URL链接。HTML中的链接是a标签,使用文档跟节点的findall方法以及一个XPath(对文档的“查询”的一种表示手段)
links=doc.findall('.//a')
print links[15:20]
结果为:
[<Element a at 0x9876d68>, <Element a at 0x9876db8>, <Element a at 0x9876e08>, <Element a at 0x9876e58>, <Element a at 0x9876ea8>]
但这些表示HTML元素的对象。要得到URL和链接文本,必须使用各对象的get方法和text_content方法
print lnk.get('href')
print lnk.text_content()
结果为:
https://help.yahoo.com/l/us/yahoo/finance/
Help
因此,编写下面这条列表推导式即可获取文档中的全部URL
urls=[lnk1.get('href') for lnk1 in doc.findall('.//a')]
print urls[-10:]
结果为:
Help
['/q/op?s=AAPL&strike=185.00', '/q?s=AAPL160617P00185000', '/q/op?s=AAPL&strike=190.00', '/q?s=AAPL160617P00190000', '/q/op?s=AAPL&strike=195.00', '/q?s=AAPL160617P00195000', '/q/op?s=AAPL&strike=200.00', '/q?s=AAPL160617P00200000', '/q/op?s=AAPL&strike=220.00', '/q?s=AAPL160617P00220000']
现在从文档中找出正确表格
tables=doc.findall('.//table')
print tables
calls=tables[2]
puts=tables[0]
rows=calls.findall('.//tr')
def _unpack(row,kind='td'):
elts=row.findall('.//%s' % kind)
return [val.text_content() for val in elts]
print _unpack(rows[0],kind='th')
print _unpack(rows[1],kind='td')
5.二进制数据格式