利用Python进行数据分析(八)
2018-01-04 本文已影响78人
BrainZou
数据加载、存储与文件格式
既然要对大量的数据进行分析,而数据当然不可能平白无故的产生。其输入输出通常可以划分为几个大类:读取文本文件和其他更高效的磁盘存储格式(txt table csv等),加载数据库中的数据,利用Web API操作网络资源。
读写文本格式的数据
函数 | 说明 |
---|---|
read_csv | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号 |
read_table | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符("\t") |
read_fwf | 读取定宽列格式数据(也就是说,没有分隔符) |
read_clipboard | 读取剪贴板中的数据,可以看做read table的剪贴板版.在将网页转换为表格时很有用 |
pandas可以将表格型数据读取为DataFrame对象。常用函数如下,其中read_csv 和read_table最为常用。
函数 | 说明 |
---|---|
read_csv | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号 |
read_table | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符("\t") |
read_fwf | 读取定宽列格式数据(也就是说,没有分隔符) |
read_clipboard | 读取剪贴板中的数据,可以看做read table的剪贴板版.在将网页转换为表格时很有用 |
类型推断(type inference)是最重要的功能之一,也就是说.你不需要指定列的类型到底是数值、整数、布尔值,还是字符串。日期和其他自定义类型的处理需要多花点工夫才行。
#默认逗号是分隔符
df = pd.read_csv('cho6/exi.csv')
#用read_table则要指明逗号
pd.read_table('cho6/exi.csv', sep=',')
#如果分隔符不为逗号怎么办呢?可以使用read_table sep使用正则表达式即可(如‘\s+’意义是不定数目的空格作为分隔符)。
#names参数可以指明列名 或者 header=None使用默认
#index cot='message 可以指明需要用来做索引的列得到下列这种效果。
a b c d
message
hello 1 2 3 4
world 5 6 7 8
foo 9 10 11 12
也可以传入多个列作为前面说到过的层次化索引。得到下面这种效果:
value1 value2
key1 key2
one a 1 2
b 3 4
c 5 6
d 9 10
two a 11 12
当然你也可以选择跳过一些行:
#跳过第一,三,四行
pd.read_csv('cho6/ex4.csv', skiprows=[0, 2, 3])
缺失值也是很常见的一种情况。
#指明表示缺失值的字符串(说明csv中Null代表缺失)
result = pd.read_csv('ch06/ex5.csv', na_values=['NULL'])
#为各列指明不同的NA标记值
#message列foo和NA代表缺失,something列two代表缺失。
sentinels = {'message
'foo', 'NA'], 'something':two']}
pd.read_csv('cho6/ex5.csv', navalues=sentinels)
read_csv read_table常用参数 | 说明 |
---|---|
path | 表示文件系统位置、URL、文件型对象的字符串 |
sep/delimiter | 用来拆分的字符序列或正则表达式 |
header | 作列名的行号,默认为0,没有时设置为None |
index_col | 作行索引的列编号或列名 也可以多个组成的列表(层次化索引) |
names | 结果的列名列表 |
skiprows | 值:忽略的行数。列表:跳过的行号 |
na_values | 被认为是缺失的值 |
comment | 用干将注释信息从行尾拆分出去的字符(一个或多个) |
parse_dates | 尝试将数据解析为日期.默认为False。如果为True,则尝试解析所有列。此外,还可以指定需要解析的一组列号或列名。如果列表的元素为列表或元组,就会将多个列组合到一起再进行日期解析工作(例如,日期/时间分别位于两个列中) |
keep_date_col | 如果连接多列解析日期,则保持参与连接的列。默认为false |
converters | 由列号/列名跟函数之间的映射关系组成的字典。例如,{'foo': f}会对foo列的所有值应用函数f |
dayfirst | 当解析有歧义的日期时,将其看做国际格式(例如,7/6/2012一June7, 2012)。默认为False |
date_parser | 用于解析日期的函数 |
nrows | 需要读取的行数(从文件开始处算起) |
iteFator | 返回一个Textparser以便逐块读取文件 |
chunksize | 文件块的大小(用于迭代) |
skip_footer | 需要忽略的行数(从文件末尾处算起) |
verbose | 打印各种解析器输出信息,比如“非数值列中缺失值的数量”等 |
encoding | 用于unicode的文本编码格式。 |
squeeze | 如果数据经解析后仅含一列,则返回Series |
thousands | 千分位分隔符,如,或者. |
逐块读取文本文件
简单的只读取五行 参数 nrows=5
逐步迭代读取 chunksize
chunker = pd.read_csv('cho6/ex6.csv', chunksize=loo0)
tot = Series([])
for piece in chunker:
tot = tot.add(piece['key'].value_counts(), fill_value=0)
tot = tot. order(ascending=False)
#上面就做到了对整个csv逐步的读取 最后统计出key这列分别出现次数
TextParser还有一个get_chunk方法,它使你可以读取任意大小的块。
将数据写出到文本格式
上面的过程也是能反过来的,即DateFrame可以通过to_csv方法得到一个以逗号分隔的文件。
相同的,设置参数sep可以指定分割符。
缺失值指定则使用的是na_rep='NULL'这个参数等等。
Series也有to_csv方法:
ts.to_csv('cho6/tseries.csv')
#读csv
Series.fron_csv('cho6/tseries.csv', parse dates=True)
手工处理分割符格式
对于比较畸形的文件,直接使用read_table不成功时则需要手工来处理。比如下面这个csv:
"a","b","c"
"1","2","3"
"1","2","3","4"
怎么处理呢,如下:
import csv
f = open('ch06/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('ch06/ex7.csv')))
header,values = lines[0],lines[1:]
data_dict = {h: v for h, v in zip(header,zip(*values))}
data_dict
{'a':('1','1'),'b':('2','2'),'c':('3','3')}
csv可以指定各种格式,通过下面这种定义一个csv.Dialect的一个子类的方法:
class my_dialect(csv.Dialect):
lineterminator = '\n'
delimiter = ';'
quotechar = ' " '
reader = csv.reader(f,diaect = my_dialect)
#也可以直接给csv.reader,如下:
reader = csv.reader(f, delimiter='|')
参数 | 说明 |
---|---|
delimiter | 用于分隔字段的单字符字符串。默认为"," |
lineterminator | 用于写操作的行结束符,默认为“\r\n"。读操作将忽略此选项,它能认出跨平台的行结束符 |
quetechar | 用于带有特殊字符(如分隔符)的字段的引用符号。默认为"·" |
quoting | 引用约定。可选值包括csv.QUOTE_ALL(引用所有字段),csv.QUOTE_MINIMAL(只引用带有诸如分隔符之类特殊字符的字段)、csv.QUOTE_NONNUMERIC以及csv.QUOTE_NON(不引用)。完整信息请参考Python的文档.默认为QUOTE_MINIMAL |
skipinitialspace | 忽略分隔符后面的空白符。默认为False |
doublequote | 如何处理字段内的引用符号。如果为True,则双写。完整信息及行为请参见在线文档 |
escapechar | 用于对分隔符进行转义的字符串(如果quoting被设置为csv.QUOTE_NONE的话)。默认禁用 |
JSON数据
import json
#通过json.loads可将JSON数据字符串转换成Python形式:
result = json.loads(obj)
#json.dumps则把Python对象转换成JSON格式:
asjson = json.dumps(result)
#
siblings = DataFrame(result['siblings'], columns['names','age'])
siblings
out: name age
0 Scott 25
1 Katie 33
XML和HTML:Web信息收集
有许多的库都可以用来读取XML和HTML格式,比如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()
得到这个对象后就可以为所欲为了。这个如果接触过爬虫方面可能就不感觉陌生了。
比如
#找到所有链接(即a标签)
links = doc.findall('.//a')
#上面得到的只是链接那个对象,要得到链接文本还需要:
links[28].get('href')
out:
'http://biz.yahoo.com/special.html'
总结
本章节主要就是读取到txt csv table json xml 格式的文件,转化到Python里进行处理。