数据加载\存储与文件格式

输入输出通常可以划分为几大类:

读取文本文件和其他更高效的磁盘存储格式
加载数据库中的数据
利用Web API操作网络资源

读写文本格式的数据

pandas中的解析函数

read_csv 从文件\URL\文件型对象中加载带分隔符的数据.默认分隔符为逗号
read_table 默认分隔符为制表符"\t"
read_fwf 读取顶宽列格式数据(没有分隔符)
read_clipboard 读取剪贴板中的数据,在网页转换为表格时很有用

这些函数的选项:

索引: 是否从文件\用户获取列名
类型推断和数据转换: 包括用户定义值的转换\缺失值标记列表
日期解析: 包括组合功能
迭代: 支持对大文件进行逐块迭代
不规整数据问题: 跳过一些行\页脚\注释或其他一些不重要的东西

window系统中
!type 绝对路径(不用引号且要使用"\")可以打印文本的原始内容

df = pd.read_csv('绝对路径')
也可以使用read_table,但是需要传入参数sep=','

可以通过index_col参数指定索引,若要指定层次化索引则传入列表即可

可以编写一个正则表达式作为read_table的分隔符

可以用skiprows=数字列表传入来跳过某些不去解析的行

缺失值处理,传入na_values参数

表6-2 包含read_csv\read_table函数的参数

逐块读取文本文件

传入nrows指定行;
传入chunksize对文件进行迭代,返回一个迭代对象

chunker=pd.read_csv('ch06/ex6.csv',chunksize=1000)
tot=Series([])
for piece in chunker:
tot=tot.add(piece['key'].value_counts(),fill_value=0)
tot=tot.order(ascending=False)

将数据写入到文本格式

data=pd.read_csv('ch06/ex5.csv')

利用DataFrame的to_csv方法,我们可以将数据写入到一个以逗号分隔的文件中
data.to_csv('ch06/out.csv')

还可以使用其他分隔符(由于这里写出到sys.stdout,所以仅仅是打印出文本结果)
data.to_csv(sys.stdout,sep='|')

缺失值在输出结果会被表示为空字符串,传入na_rep='NULL'可以表示为其他标记值
data.to_csv(sys.stdout,na_rep='NULL')

可以禁用行和列的标签
data.to_csv(sys.stdout,index=False,header=False)

还可以只写出一部分的列,并以指定的顺序排列
data.to_csv(sys.stdout,index=False,columns=['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('ch06/tseries.csv')

虽然只需一点整理工作(无header行,第一列作索引)就能用read_csv将CSV文件读取为Series,但还有一个更为方便的from_csv方法
Series.from_csv('ch06/tseries.csv',parse_dates=True)

手工处理分隔符格式

import csv #python内置的csv模块
f = open('d:/python/data/ex7.csv')
reader = csv.reader(f) #将打开的文件对象传给csv.reader
for line in reader:
    print(line) #进行迭代会为每行产生一个列表(注意这里移除了源文件中的双引号)

In [50]: lines = list(csv.reader(open('d:/python/data/ex7.csv')))
...: header, values = lines[0], lines[1:]
...: data_dict = {h: v for h, v in zip(header, zip(*values))} #关于zip函数的应用
In [51]: data_dict
Out[51]: {'a': ('1', '1'), 'b': ('2', '2'), 'c': ('3', '3')}

CSV文件的形式有很多,只需定义csv.Dialect的一个子类即可定义出新格式(如专门的分隔符\字符串引用约定\行结束符等)
In [58]: class my_dialect(csv.Dialect):
...:    lineterminator = '\n'
...:    delimiter = ';'
...:    quotechar = '"'
...:    quoting = csv.QUOTE_MINIMAL
reader = csv.reader(f, diaect=my_dialect)

各个CSV语支的参数也可以以关键字的形式提供给csv.reader,而无需定义子类
reader = csv.reader(f, delimiter = '|')

表6-3: CSV语支选项

要手工输出分隔符文件,可以使用csv.writer. 它接受一个已打开且可写的文件对象,以及跟csv.reader相同的那些语支和格式化选项
In [64]: with open('mydata.csv', 'w') as f:
...:    writer = csv.writer(f, dialect=my_dialect)
...:    writer.writerow(('one', 'two', 'three'))
...:    writer.writerow(('1', '2', '3'))
...:    writer.writerow(('4', '5', '6'))
...:    writer.writerow(('7', '8', '9'))

JSON数据

import json

json.loads将JSON字符串转换成python形式
json.dumps将python对象转换成python形式

如何将JSON对象转换为DataFrame数据结构?
向DataFrame构造器传入JSON对象,并选取数据字段的子集
In [77]: obj = """
...: {"name": "Wes",
...:  "places_lived": ["United States", "Spain", "Germany"],
...:  "pet": null,
...:  "siblings": [{"name": "Scott", "age": 25, "pet": "Zuko"},
...:              {"name": "Katie", "age": 33, "pet": "Cisco"}]
...: }
...: """
In [80]: result = json.loads(obj)
In [81]: siblings = DataFrame(result['siblings'], columns=['name', 'age'])
In [82]: siblings
Out[82]:
    name  age
0  Scott  25
1  Katie  33

XML和HTML:Web信息收集

利用python爬虫获取信息,之后利用pandas的TextParser类做类型转换
from pandas.io.parsers import TextParser

利用lxml.objectify解析xml

二进制数据格式

最简单的方法之一:使用python内置的pickle序列化
frame=pd.read_csv('ch06/ex1.csv')
frame.to_pickle('ch06/frame_pickle')
pd.read_pickle('ch06/frame_pickle') #读取二进制数据

使用HDF5格式

store=pd.HDFStore('mydata.h5') #这个HDFStore是类似于字典的类
store['obj1']=frame
store['obj1_col']=frame['a']
store
File path: mydata.h5
/obj1                frame        (shape->[3,5])
/obj1_col            series      (shape->[3])
store['obj1']
a  b  c  d message
0  1  2  3  4  hello
1  5  6  7  8  world
2  9  10  11  12    foo
store.close() #关闭打开的HDF5文件
os.remove('mydata.h5') #移除刚才生成的文件

好好研究一下PyTables和h5py;许多数据分析问题都是IO密集型(而不是CPU密集型),利用HDF5这样的工具能显著提升应用程序的效率

警告: HDF5不是数据库. 它最适合用作"一次写多次读"的数据集. 虽然数据可以在任何时候被添加到文件中,但如果同时发生多个写操作,文件就可能被破坏.

读取Excel文件

ExcelFile类支持读取Excel表格型数据,需要安装xlrd和openpyxl包(anaconda已内置)
xls_file = pd.ExcelFile('data.xls')
table = xls_file.parse('Sheet1') #这里解析xls_file的第一个表格Sheet1

使用HTML和Web API

通过requests库访问API,再利用json库解析

使用数据库

存取MongoDB中的数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容