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.二進制數據格式