《利用python进行数据分析》——第6章 数据加载、存储与文件格式——读书笔记

本文详细介绍了使用Python的pandas库进行数据加载、存储和处理各种文件格式,包括读写CSV、文本、JSON、XML、HTML等,强调了pandas的read_csv、read_table等函数的使用技巧,以及数据分块读取和缺失值处理。还提到了二进制格式如pickle和HDF5,以及如何与数据库交互。
摘要由CSDN通过智能技术生成

第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

参数              说明

path            表示文件系统位置、url、文件型对象的字符串

sep或delimiter   用于对行各字段进行拆分的字符序列或正则表达式

header          用作列名的行号。默认为0(第一行),如果没有header行就应该设置为None

index_col       用作行索引的列编号或列名。可以是单个名称/数字或多个名称/数字组成的列表(层次化索引)

names           用于结果的列名列表,结合header=None

skiprows        需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)

na_values       一组用于替换NA的值

comment         用于将注释信息从行尾拆分出去的字符(一个或多个)

parse_dates     尝试将数据解析为日期,默认为False.如果为True,则尝试解析所有列。此外,还可以指定需要解析的一组

                列号或列名。如果列表的元素为列表或元组,就会将多个列组合到一起再进行日期解析工作(例如,日期/时间

                分别位于两个列中)

keep_date_col   如果连接多列解析日期,则保持参与连接的列。默认为False.

converters      由列号/列名跟函数之间的映射关系组成的字典。例如,{‘foo':f}会对foo列的所有值应用函数f

dayfirst        当解析有歧义的日期时,将其看做国际格式(例如:7/6/2012->June,7,2012).默认为False

date_parser     用于解析日期的函数

nrows           需要读取的行数(从文件开始处算起)

iterator        返回一个TextParser以便逐块读取文件

chunksize       文件块的大小(用于迭代)

skip_footer     需要忽略的行数(从文件末尾处算起)

verbose         打印各种解析器输出信息,比如“非数值列中缺失值的数量”等

encoding        用于unicode的文本编码格式。

squeeze         如果数据经解析后仅含一列,则返回Series

thousands       千分位分隔符,如“,”或“。”


逐块读取文本文件:

在处理很大文件时,或找出大文件中的参数集以便于后续处理时,你可能只想读取文件的一小部分或逐块对文件进行迭代。

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值