第6章 数据加载、存储与文件格式
6.1 读写文本格式的数据
pandas提供了一些用于将表格型数据读取为DataFrame对象的函数。
其中read_csv和read_talbe用得最多
pandas中的解析函数:
函数 说明
read_csv 从文件、URL、文件型对象中加载带分隔符的数据,默认分隔符为逗号
read_table 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符("\t")
read_fwf 读取定宽列格式数据(也就是说,没有分隔符)
read_clipboard 读取剪贴板中的数据,可以看做read_table的剪贴板版。在将网页转换为表格时很有用
下面介绍一下这些函数在将文本数据转换为DataFrame时所用到的一些技术。这些函数的选项可以划分为以下几个大类:
(1)索引:将一个或多个列当做返回的DataFrame处理,以及是否从文件、用户获取列名
(2)类型推断和数据转换:包括用户定义值的转换、缺失值标记列表等。(类型推断是这些函数中最重要的功能之一)
(3)日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列。
(4)迭代:支持对大文件进行逐块迭代。
(5)不规整数据问题:跳过一些行、页脚、注释或其他一些不重要的东西(比如成千上万个逗号隔开的数值数据)
1. 读写文本格式的数据:
(1)由于该文件以逗号分隔,所以我们可以使用read_csv将其读入一个DataFrame:
import pandas as pd
import numpy as np
#'ex1.csv'的内容如下:
# a,b,c,d,message
# 1,2,3,4,hello
# 5,6,7,8,world
# 9,10,11,12,foo
df=pd.read_csv('ex1.csv')
print df
#输出结果如下:
# a b c d message
# 0 1 2 3 4 hello
# 1 5 6 7 8 world
# 2 9 10 11 12 foo
(2)我们也可以用read_table,只不过需要指定分隔符而己:
df=pd.read_table('ex1.csv',sep=',')
print df
#输出结果如下:
# a b c d message
# 0 1 2 3 4 hello
# 1 5 6 7 8 world
# 2 9 10 11 12 foo
(3)读入文件可以让pandas为其分配默认的列名,也可以自己定义列名:
print pd.read_csv('ex1.csv',header=None)
#输出结果如下:
# 0 1 2 3 4
# 0 a b c d message
# 1 1 2 3 4 hello
# 2 5 6 7 8 world
# 3 9 10 11 12 foo
print pd.read_csv('ex1.csv',names=['a','b','c','d','message'])
#输出结果如下:
# a b c d message
# 0 a b c d message
# 1 1 2 3 4 hello
# 2 5 6 7 8 world
# 3 9 10 11 12 foo
(4)假如希望将message列做成DataFrame的索引,也可以明确表示要将该列放到索引4的位置上,也可以通过index_col参数指定"message"
names=['a','b','c','d','message']
print pd.read_csv('ex1.csv',names=names)
#输出结果如下:
# a b c d message
# 0 a b c d message
# 1 1 2 3 4 hello
# 2 5 6 7 8 world
# 3 9 10 11 12 foo
print pd.read_csv('ex1.csv',names=names,index_col='message')
#输出结果如下:
# a b c d
# message
# message a b c d
# hello 1 2 3 4
# world 5 6 7 8
# foo 9 10 11 12
(5)如果希望将多个列做成一个层次化索引,只需传入由列编号或列名组成的列表即可:
#'csv_mindex.csv'的内容如下:
# key1,key2,value1,value2
# one,a,1,2
# one,b,3,4
# one,c,5,6
# one,d,7,8
# two,a,9,10
# two,b,11,12
# two,c,13,14
# two,d,15,16
parsed=pd.read_csv('csv_mindex.csv',index_col=['key1','key2']) #index_col表示为行索引
print parsed
# value1 value2
# key1 key2
# one a 1 2
# b 3 4
# c 5 6
# d 7 8
# two a 9 10
# b 11 12
# c 13 14
# d 15 16
(6)有些表示可能不是用固定的分隔符去分隔字段的(比如空白符或其它字符串)。对于这些情况,可以编写一个正则表达式来作为read_table
# 的分隔符。看下面的文本文件
#'ex3.txt'的内容如下
# A B C,
# aaa -0.264438 -1.026059 -0.619500
# bbb 0.9283898 0.3928928 -0.032388
# ccc -0.264327 -0.386313 -0.217601
# ddd -0.878218 -0.348238 1.1004919
print list(open('ex3.txt'))
#输出结果如下:
# [' A B C,\n',
# 'aaa -0.264438 -1.026059 -0.619500\n',
# 'bbb 0.9283898 0.3928928 -0.032388\n',
# 'ccc -0.264327 -0.386313 -0.217601\n',
# 'ddd -0.878218 -0.348238 1.1004919']
#该文件各个字段由数量不定的空白符分隔,则可以用正则表达式\s+表示:
#正则表达式:\s表示空白符,\S非空白符,+表示后面会一直匹配下去。即\s+会匹配多个空格符
result=pd.read_table('ex3.txt',sep='\s+')
print result
#输出结果如下:
# A B C,
# aaa -0.264438 -1.026059 -0.619500
# bbb 0.928390 0.392893 -0.032388
# ccc -0.264327 -0.386313 -0.217601
# ddd -0.878218 -0.348238 1.100492
#注意:这里由于列名比数据行的数量少(即A,B,C三个列名,但是列的数据是4列),所以read_table推断第一列应该是DataFrame的索引。
(7)skiprows跳过文件的一些行,可以帮助处理各种各样的异形文件格式
#'ex4.csv'的内容如下:
##hey!
# a,b,c,d,message
# #just wanted to make thins more difficult for u
# # who reads CSV files with computers,anyway?
# 1,2,3,4,hello
# 5,6,7,8,world
# 9,10,11,12,foo
print pd.read_csv('ex4.txt',skiprows=[0,2,3])
#输出结果如下:
# a b c d message
# 0 1 2 3 4 hello
# 1 5 6 7 8 world
# 2 9 10 11 12 foo
(8)缺失值处理是文件解析任务中的一个重要组成部分。缺失数据经常是要么没有(空字符串),要么用某个标记值表示。
#默认情况下,pandas会用一组经常出现的标记值进行识别,如NA,-1.#IND以及NULL等。
#'ex5.csv'的内容如下:
# something,a,b,c,d,message
# one,1,2,3,4,NA
# two,5,6,,8,world
# three,9,10,11,12,foo
result=pd.read_csv('ex5.csv')
print result
#输出结果如下:
# something a b c d message
# 0 one 1 2 3.0 4 NaN
# 1 two 5 6 NaN 8 world
# 2 three 9 10 11.0 12 foo
print pd.isnull(result) #查看为缺失值
#输出结果如下:
# something a b c d message
# 0 False False False False False True
# 1 False False False True False False
# 2 False False False False False False
(9) na_values可以接受一组用于表示缺失值的字符串:
result=pd.read_csv('ex5.csv',na_values=['NULL'])
print result
#输出结果如下:
# something a b c d message
# 0 one 1 2 3.0 4 NaN
# 1 two 5 6 NaN 8 world
# 2 three 9 10 11.0 12 foo
(10) 可以用一个字典为各列指定不同的NA标记值
sentinels={'message':['foo','NA'],'something':['two']}
#将message列中的foo标成NA,something的two也标成NA
print pd.read_csv('ex5.csv',na_values=sentinels)
#输出结果如下:
# something a b c d message
# 0 one 1 2 3.0 4 NaN
# 1 NaN 5 6 NaN 8 world
# 2 three 9 10 11.0 12 NaN
read_csv/read_table函数的参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
逐块读取文本文件:
在处理很大文件时,或找出大文件中的参数集以便于后续处理时,你可能只想读取文件的一小部分或逐块对文件进行迭代。
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
#'ex6.csv'的内容如下:
# <class 'pandas.core.frame.DataFrame'>
# Int64Index:10000 entries, 0 to 9999
# Data columns:
# one 10000 non-null values
# two 10000 non-nul