《Python 数据分析》笔记——数据的检索、加工与存储

数据的检索、加工与存储

1.利用Numpy和pandas对CSV文件进行写操作

对CSV文件进行写操作,numpy的savetxt()函数是与loadtxt()相对应的一个函数,他能以诸如CSV之类的区隔型文件格式保存数组:

np.savetxt(‘np.csv‘,a,fmt=‘%.2f‘,delimiter=‘,‘,header="#1,#2,#3,#4")

上面的函数调用中,我们规定了用以保存数组的文件的名称、数组、可选格式、间隔符(默认为空格符)和一个可选的标题。

利用随机数组来创建pandas DataFrame,如下:

df=pd.DataFrame(a)

利用pandas的to_csv()方法可以为CSV文件生成一个DataFrame

df.to_csv(‘pd.csv‘,float_format=‘%.2f‘,na_rep="NAN!")

对于这个方法,我们需要提供文件名、类似于Numpy的savetxt()函数的格式化参数的可选格式串和一个表示NaN的可选字符串

2.Numpy.npy与pandas DataFrame

大部分情况下,用CSV格式来保存文件是不错的主意,因为大部分程序设计语言和应用程序都能处理这种格式,所以交流起来非常方便。然而,这种格式有一个缺陷,就是它的存储效率不是很高,原因是CSV及其他纯文本格式中含有大量空白符;而后来发明的一些文件格式,如zip、bzip和gzip等,压缩率则有了显著提升。

import numpy as np
import pandas as pd
from tempfile import NamedTemporaryFile
from os.path import getsize

np.random.seed(42)
a=np.random.randn(365,4)

tmpf=NamedTemporaryFile()
np.savetxt(tmpf,a,delimiter=‘,‘)
print("Size CSV file",getsize(tmpf.name))

tmpf=NamedTemporaryFile()
np.save(tmpf,a)
tmpf.seek(0)
loaded=np.load(tmpf)
print("shape",loaded.shape)
print("Size .npy file",getsize(tmpf.name))

df=pd.DataFrame(a)
df.to_pickle(tmpf.name)
print("Size pickled dataframe",getsize(tmpf.name))
print("DF from pickle\n",pd.read_pickle(tmpf.name))

Numpy为自己提供了一种专用的格式,称为.女朋友,可以用于存储Numpy数组。在进一步说明这种格式之前,我们先来生成一个365×4d的Numpy数组,并给各个元素填充上随机值。这个数组可以看成是一年中4个随机变量的每日观测值的模拟。这里我们使用Python标准的NamedTemporaryFile来存储数据,这些临时文件随后会自动删除。

下面将该数组存入一个CSV文件,并检查其大小,代码如下:

tmpf=NamedTemporaryFile()
np.savetxt(tmpf,a,delimiter=‘,‘)
print("Size CSV file",getsize(tmpf.name))

下面首先以Numpy.npy格式来保存该数组,随后载入内存,并检查数组的形状以及该.npy文件的大小,具体代码如下所示:

tmpf=NamedTemporaryFile()
np.save(tmpf,a)
tmpf.seek(0)
loaded=np.load(tmpf)
print("shape",loaded.shape)
print("Size .npy file",getsize(tmpf.name))

为了模拟该临时文件的关闭与重新打开过程,我们在上面的代码中调用了seek()函数。数组的形状以及文件大小如下所示:

Shape(365,4)
Size .npy file 11760

不出所料,.npy文件的大小只有CSV文件的1/3左右。实际上,利用Python可以存储任意复杂的数据结构。也可以序列化格式来存储pandas的DataFrame或者Series数据结构。

提示:

在Python中,pickle是将Python对象存储到磁盘或其他介质时采用的一种格式,这个格式化的过程叫做序列化(pickling).之后,我们可以从存储器中重建该Python对象,这个逆过程称为反序列化(unpickling).

首先用前面生成的Numpy数组创建一个DataFrame,接着用to_pickle()方法将其写入一个pickle对象中,然后用read_pickle()函数从这个pickle对象中检索该DataFrame:

df=pd.DataFrame(a)
df.to_pickle(tmpf.name)
print("Size pickled dataframe",getsize(tmpf.name))
print("DF from pickle\n",pd.read_pickle(tmpf.name))

该DataFrame经过序列化后,尺寸略大于.npy文件。

3.使用PyTables 存储数据

层次数据格式(HDF)是一种存储大型数值数据的技术规范,起源于超级计算社区,目前已经成为一种开放的标准。这里用HDF5,该版本仅仅通过组(group)和数据集(dataset)这两种基本结构来组织数据。数据集可以是同类型的多维数组,而组可以用来存放其他组或者数据集。这里的“组”跟层次式文件系统中的“目录”非常像。

HDF5最常见的两个主要Python程序库是:

1.h5y

2.PyTables

本例中使用的是PyTables。不过,这个程序库需要用到一些依赖项,比如:

1.Numpy

2.numexpr:该程序包在计算包含多种运算的数组表达式时,其速度要比Numpy快许多倍

3.HDF5:如果使用HDF5的并行版本,则还需要安装MPI.

据Numexpr自称,它在某些方面的运算速度要比Numpy快得多,因为它支持多线程,并且自己得虚拟机是C语言实现得。

此外,我们需要生成一些随机数,并用它们来给一个Numpy数组赋值。下面创建一个HDF5文件,并把这个Numpy数组挂载到根结点上

from tempfile import NamedTemporaryFile
import numpy as np
from os.path import getsize

a=np.random.randn(365,4)
tmpf=NamedTemporaryFile()
h5file=tables.openfile(tmpf.name,mode=‘w‘,title="Numpy Array")
root=h5file.root
h5file.createArray(root,"array",a)
h5file.close()

#读取这个HDF5,并显示文件大小
h5file=tables.openfile(tmpf.name,"r")
print(getsize(tmpf.name))

通过遍历取为里面的数据

for node in h5file.iterNodes(h5file.root):
    b=node.read()
    print(type(b),b.shape)

4.Pandas DataFrame与HDF5仓库之间的读写操作

HDFStore类可以看作是pandas中负责HDF5数据处理部分的一种抽象。借助一些随机数据和临时文件,可以很好地展示这个类地功能特性,具体步骤如下所示:

将临时文件地路径传递给HDFStore的构造函数,然后创建一个仓库:

store=pd.io.pytables.HDFStore(tmpf.name)
print(store)

上述代码将打印输出该仓库的文件路径及其内容,不过,此刻他还没有任何内容。

HDFStore提供了一个类似字典类型的接口,如我们可以通过pandas中DataFrame的查询键来存储数值。为了将包含随机数据的一个DataFrame存储到HDFStore中,可以使用下列代码:

store[‘df‘]=df
print(store)

我们可以用三种方式来访问DataFrame,分别是:使用get()方法访问数据,利用类似字典的查询键访问数据,或者使用点运算符号来访问数据:

print("Get",store.get(‘df‘).shape)
print("Lookup",store[‘df‘].shape)
print("Dotted",store.df.shape)

该DataFrame的形状同样也可以通过3种不同的方式进行访问

为了删除仓库中的数据,我们既可以使用remove()方法,也可以使用del运算符。当然,每个数据只能删除一次。

del store[‘df‘]

属性 is_open的作用是指出仓库是否处于打开状态。为了关闭一个仓库,可以调用close()方法。下面代码展示关闭仓库的方法,并针对仓库的状态进行了相应的检查:

print("Before close",store.is_open)
store.close()
print("After close",store.is_open)

为读写HDF数据,pandas还提供了两种方法:一种是DataFrame的to_hdf()方法;另一种是顶级的read_hdf()函数。

df.to_hdf(tmpf.name,‘data‘,format=‘table‘)
print(pd.read_hdf(tmpf.name,‘data‘,where=[‘index>363‘]))

用于读写操作的应用程序接口的参数包括:文件路径、仓库中组的标识符以及可选的格式串。这里的格式有两种:一种是固定格式;一种是表格格式。固定格式的优点是速度要更快一些,缺点是无法追加数据,也不能进行搜索。表格格式相当于PyTables的Table结构,可以对数据进行搜索和选择操作。

5.使用pandas读写Excel文件

现实中许多重要数据都是以Excel文件的形式存放的。当然,如果需要,也可以将其转换为可移植性更高的诸如CSV之类的格式。不过,利用Python来操作Excel文件会更加方便。在Python的世界里,为实现同一目标的项目通常不止一个,如提供Excel I/O操作功能的项目就是如此。只要安装了这些模块,就能让pandas具备读写Excel文件的能力,只是这些方面的说明文档不是很完备,其原因是pandas依赖的这些项目往往各自为战,并且发展极为迅猛。这些pandas程序包对于Excel文件也很挑剔,要求这些文件的后缀必须是.xls或者.xlsx;否则会报错。

模块openpyxl源于PHPExcel,它提供了针对.xlsx文件的读写功能。

模块xlsxwriter也需要读取.xlsx文件

模块xlrd能用来析取.xls和.xlsx文件中的数据。下面,我们先来生成用于填充pandas中DataFrame的随机数,然后用这个DataFrame创建一个Excel文件,接着再用Excel文件重建DataFrame,并通过mean()方法来计算其平均值。对于Excel文件的工作表,我们既可以为其指定一个从0开始计数的索引,也可以为其规定一个名称

import numpy as np
import pandas as pd
from tempfile import NamedTemporaryFile

np.random.seed(42)
a=np.random.randn(365,4)

tmpf=NamedTemporaryFile(suffix=‘.xlsx‘)
df=pd.DataFrame(a)
print(tmpf.name)
df.to_excel(tmpf.name,sheet_name=‘Random Data‘)
print("Means\n",pd.read_excel(tmpf.name,‘Random Data‘).mean())

通过to_excel()方法创建Excel文件,有用顶级read_excel()函数来重建DataFrame

6.使用pandas读写JSON

pandas提供的read_json()函数,可以用来创建pandas Series或者pandas DataFrame数据结构。

import pandas as pd
json_str=‘{"country":"Netherlands","dma_code":"0","timezone":"Europe\/Amsterdam","area_code":"0","ip":"46.19.37.108","asn":"AS196752","continent_code":"EU","isp":"Tilaa V.O.F.","longitude":5.75,"latitude":52.5,"country_code":"NL","country_code3":"NLD"}‘

data=pd.read_json(json_str,typ=‘series‘)
print("Series\n",data)

data["country"]="Brazil"
print("New Series\n",data.to_json())

调用read_json()函数时,既可以向其传递一个JSON字符串,也可以为其指定一个JSON文件的路径。上面的例子中,我们是利用JSON字符串来创建pandas Series

并且再次修改country的值,并用to_json()方法将其从pandas Series转换为JSON字符串

原文地址:https://www.cnblogs.com/yifdu25/p/8437223.html

时间: 2024-10-13 01:21:22

《Python 数据分析》笔记——数据的检索、加工与存储的相关文章

python数据分析笔记——数据加载与整理]

[ python数据分析笔记--数据加载与整理] https://mp.weixin.qq.com/s?__biz=MjM5MDM3Nzg0NA==&mid=2651588899&idx=4&sn=bf74cbf3cd26f434b73a581b6b96d9ac&chksm=bdbd1b388aca922ee87842d4444e8b6364de4f5e173cb805195a54f9ee073c6f5cb17724c363&mpshare=1&scene=

python数据分析入门——数据导入数据预处理基本操作

数据导入到python环境:http://pandas.pydata.org/pandas-docs/stable/io.html(英文版) IO Tools (Text, CSV, HDF5, ...)? The pandas I/O API is a set of top level reader functions accessed like pd.read_csv() that generally return a pandasobject. read_csv read_excel re

Python学习笔记-数据报表之Excel操作模块

利用Python操作Excel的模块XlsxWriter,可以操作多个工作表的文字.数字.公式.图表等. XlsxWriter模块具有以下功能: 100%兼容的Excel XLSX文件,支持Excel 2003.Excel 2007等版本: 支持所有Excel单元格数据格式: 单元格合并.批注.自动筛选.丰富多格式字符串等: 支持工作表PNG.JPEG图像,自定义图表: 内存优化模式支持写入大文件. 安装XlsxWriter模块 # python3 -m easy_install -i http

python数据分析笔记中panda(2)

1 将手机号码分开为运营商,地区和号码段 1 from pandas import read_csv; 2 3 df = read_csv("H:\\pythonCode\\4.6\\data.csv"); 4 5 6 #转换成字符数据 方便用slice 7 df['tel'] = df['tel'].astype(str); 8 9 #字符的抽取:根据已知列数据的开始和结束的位置 抽取新的列 slice(start,stop) 10 #运营商 11 bands = df['tel']

Python数据分析_Pandas01_数据框的创建和选取

主要内容: 创建数据表 查看数据表 数据表索引.选取部分数据 通过标签选取.loc 多重索引选取 位置选取.iloc 布尔索引 Object Creation 新建数据 用list建series序列 In [73]: s = pd.Series([1,3,5,np.nan,6,8]) In [74]: s Out[74]: 0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64 用numpy array建dataframe In [75]: date

数据分析学习资料《利用Python进行数据分析第2版》+《Python数据分析与挖掘实战》+《从零开始学Python数据分析与挖掘》

数据分析涉及统计学.线性代数.图形分析绘制.数据挖掘等知识,推荐系统学习电子资料<利用Python进行数据分析第2版>.<Python数据分析与挖掘实战>.<从零开始学Python数据分析与挖掘>电子书和代码测试. <利用Python进行数据分析第2版>电子书代码,每一章之间有递进关系,适合在Python入门<Python编程从入门到实践>电子书之后阅读,本专门针对数据分析领域的.我细致地读了一遍,敲了一遍代码,一开始没有头绪,进展缓慢,后来逐渐

python 学习笔记 3 -- 数据结构篇上

数据结构是可以处理一些 数据 的 结构 .或者说,它们是用来存储一组相关数据的.在Python中有三种内建的数据结构--列表.元组和字典.本文主要对这三种数据类型以及相关的使用做介绍,以例子的形式演示更加容易理解! 1.列表(List) 列表是处理一组有序项目的数据结构,即你可以在一个列表中存储一个 序列 的项目.在Python中,你在每个项目之间用逗号分割. 列表中的项目应该包括在**方括号**中,这样Python就知道你是在指明一个列表.一旦你创建了一个列表,你可以添加.删除或是搜索列表中的

python 学习笔记 3 -- 数据结构篇下

5.引用 当你创建一个对象并给它赋一个变量的时候,这个变量仅仅 引用 那个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存.这被称作名称到对象的绑定.eg. [python] view plaincopy # -*- coding: utf-8 -*- shoplist = ['apple', 'mango', 'carrot', 'banana'] print "we copy the shoplist to mylist directly \"with

Python学习笔记_Chapter 6定制数据对象

1. 有用的BIF a. 判断字符串中是否包含子字符串 1 if s_a in s_b: b. pop() 描述:从指定的列表位置删除并返回一个数据项. 1 (sarah_name,sarah_dob)=l_rah.pop(0),l_rah.pop(0) 2 #pop(0)中0位置为list中第一个数据项 3 #第一次执行pop赋值给sarah_name c. strip() 输入的是字符串,返回的是列表 d.open 读文件时可以多种方式打开文件,取出的数据是不同的,可以是文本也可以是二进制.