pandas与numpy数据结构

Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。(下面的表格只能截图了,mweb编辑的文章不能直接发布到简书)

pandas数据结构

①Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:_List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。_

②Time- Series:以时间为索引的Series。

③DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。

④Panel :三维的数组,可以理解为DataFrame的容器。

python本身的数据结构

1. list

Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。可以使用append()方法来添加列表项。可以使用 del 语句来删除列表的的元素。

list表达式
list包含的函数
list包含的方法

2.元组

元组与列表类似,不同之处在于元组的元素不能修改。

元组使用小括号,列表使用方括号。

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

元组中只包含一个元素时,需要在元素后面添加逗号;

元组可以使用下标索引来访问元组中的值:

tup2[1:5]: (2, 3, 4, 5)

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组

元组运算


元组运算

3.字典

字典是另一种可变容器模型,且可存储任意类型对象。

字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中

d = {key1 : value1, key2 : value2 }

键必须是唯一的,但值则不必。

访问字典里的值:把相应的键放入熟悉的方括弧

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};

dict['Age'] = 8; # update existing entry

dict['School'] = "DPS School"; # Add new entry

能删单一的元素也能清空字典,清空只需一项操作。

字典内置函数
字典内置方法

Numpy数据结构

1. ndarray 数组

* ndarray是一个通用的同构数据多维容器,即所有元素必须是相同类型

* 每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(说明数组数据类型) NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2 data=array([[1, 9, 6], [2, 8, 5], [3, 7, 4]])

ndarry属性

基本的索引和切片

arr=np.arange(10)

arr[5:8]切片第6个到第8个元素

视图上的任何修改都会直接反映到源数组上。如arr[5:8]=12,则源数组的第6到第8个元素都会赋值为12.

arr[5:8].copy() 切片副本

arr2d[:2,1:] 切片第0,1行向量与第1,2列向量交组成的数组

names = np.array(['Bob','Joe'])

arr[names == 'Bob'] 布尔型索引

花式索引

arr = np.empty((8,4))

for i in range(8):

arr[i] = i

整数列索引 arr[[4,3,0,6]], arr[[-3,-5,-7]]

多个索引组

arr = np.arange(32).reshape((8,4))

arr[[1,5,7,2],[0,3,1,2]] 得到 array([4, 23, 29, 10])

arr[[1,5,7,2]][:,[0,3,1,2]]

得到

array([[4,7,5,6],

[20,23,21,22],

[28,31,29,30],

[8,11,9,10]])

np.ix_同样可以得到以上结果

arr[np.ix_([1,5,7,2],[0,3,1,2])]

花式索引总是将数据复制到新数组中

其他方法和属性

其他方法和属性

布尔值在计算过程中可以被当做0或1处理

例如,result = 1* (cond1 -cond2) + 2*(cond2 & -cond1) + 3 * -(cond1 | cond2)

数组文件的输入输出

arr=np.arange(10)

np.save('some_array', arr) 将数组以二进制格式,some_array.npy名称保存在磁盘上。

np.load('some_array.npy')加载

np.savez('array_archive.npz', a=arr, b=arr) 将多个数组保存在压缩文件中

存取文本文件

arr = np.loadtxt('array_ex.txt',delimiter=',')将文件中数据加载到二维数组中

np.savetxt执行相反操作

线性代数计算

x.dot(y) 相当于np.dot(x,y)

inv(mat) 对可逆矩阵求逆

……

随机数生成

 * numpy.random模块

 * np.random.normal(size=(4,4))生成标准正态分布的4*4样本数组

 * seed 确定随机数生成器的种子

 * permutation 返回一个序列的随机排列或返回一个随机排列的范围

 * shuffle 对一个序列就地随机排列

 * rand 产生均匀分布的样本值

 * randint 从给定的上下限范围随机取整数

pandas数据结构

1.Series结构 类似于一维数组的对象,索引在左边,值在右边,若不指定索引,会自动创建一个0~N-1的整数型索引 In: obj2 = Series([4,7,-5,3], index=['d','b','a','c']) Out: d 4 b 7 a -5 c 3

series结构

2.Pandas DataFrame结构 DataFrame是一个表格型数据结构,每列可以是不同的值类型(数值、字符串、布尔值等),它可以被看成由Series组成的字典,它既有行索引也有列索引。以一个或多个二维块存放(而不是列表、字典或别的一维数据结构) 构建DataFrame的方法:

DataFrame结构

索引对象

1.pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。index对象是不可以修改的,这样才能使index对象在多个数据结构之间安全共享。

2.重新索引 reindex

   obj2 = obj.reindex(['a','b','c','d','e'])

   按照reindex新索引进行重排,如果某个索引值不存在,就引入缺失值,

    obj.reindex(['a','b','c','d','e'], fill_value=0), 将缺失值赋值为0

   使用ffill可以实现前向值填充:

   obj3 = Series(['blue','pureple','yellow'], index=[0,2,4])

   obj3.reindex(range(6),method='ffill')

   fill/pad 前向填充(或搬运)值

   bfill/backfill 后向填充值

如果只传入一个序列则会重新索引行

使用columns关键字即可重新索引列:

frame.reindex(columns=states)

同时重新索引:frame.reindex(index=['a','b','c','d'], method='ffill', columns=states)

limit 前向或后向填充时的最大填充量

ix使重新索引更加简洁:frame.ix[['a','b','c','d'],states]

1.其他功能

2.汇总和计算描述统计

统计描述

缺失值处理

缺失值处理

层次化索引

data=Series(np.random.randn(10),index=[['a','a','a','b','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,2,3]] In: data.index Out: Multiindex[('a',1),('a',2)....] 层次化索引在数据重塑和基于分组的操作(如透视表生成)中扮演着重要角色, data.unstack()转化为一个DataFrame,其逆运算是stack data.unstack().stack()

对于DataFrame每条轴都可以有分层索引

frame = DataFrame(np.arange(12).reshape((4,3)), index=[['a','a','b','b'],[1,2,1,2]],columns=[['Ohio','Ohio','Colorado'],['Green','Red','Green']])


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

1. 读写文本格式数据

读写文本格式数据

2.逐块读取文本文件 

在处理很大的文件时,可能只想读取文件的一小部分或逐块对文件进行迭代 pd.read_csv(‘ch06/ex6.csv’, nrow=5) 只读取几行 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.ordr(ascending=False)

3.将数据写出到文本格式 

data.to_csv('ch06/out.csv') data.to_csv(sys.stout, sep='|') #指定分隔符 

data.to_csv(sys.stout, na_rep='NULL')

4.手工处理分隔符格式

直接使用Python内置的csv模块

import csv

f = open('cho6/ex7.csv')

reader = csv.reader(f)

for line in reader:

print line

这样得到一系列列表

为时数据格式合乎要求,做如下操作

lines = list(csv.reader(open('cho6/ex7.csv')))

header, values = lines[0],lines[1:]

data_dict = {h: v for h, v in zip(header, zip(*values))}

定义子类处理各种分隔符:

class my_dialect(csv.Dialect):

lineterminator = '\n'

delimiter = ';'

quotechar = '"'

reader = csv.reader(f, diaect=my_dialect)


JSON数据

JSON= JavaScript Object Notation

1.加载json数据

result=json.loads(obj)

2.将Python对象转为json格式

asjson=json.dumps(result)

3.转换为DataFrame结构

siblings = DataFrame(result['siblings'],columns=['name','age'])

4.web信息收集

from lxml.html import parse

from urllib2 import urlopen

parsed =parse(urlopen('http://www.baidu.com'))

doc = parsed.getroot()

获取该页面的所有URL

urls = [lnk.get('href') for lnk in doc.findall('.//a')]

a.pop() # 把最后一个值4从列表中移除并作为pop的返回值

a.append(5) # 末尾插入值,[1, 2, 3, 5]

a.index(2) # 找到第一个2所在的位置,也就是1

a[2] # 取下标,也就是位置在2的值,也就是第三个值3

a += [4, 3, 2] # 拼接,[1, 2, 3, 5, 4, 3, 2]

a.insert(1, 0) # 在下标为1处插入元素0,[1, 0, 2, 3, 5, 4, 3, 2]

a.remove(2) # 移除第一个2,[1, 0, 3, 5, 4, 3, 2]

a.reverse() # 倒序,a变为[2, 3, 4, 5, 3, 0, 1]

a[3] = 9 # 指定下标处赋值,[2, 3, 4, 9, 3, 0, 1]

b = a[2:5] # 取下标2开始到5之前的子序列,[4, 9, 3]

c = a[2:-2] # 下标也可以倒着数,方便算不过来的人,[4, 9, 3]

d = a[2:] # 取下标2开始到结尾的子序列,[4, 9, 3, 0, 1]

e = a[:5] # 取开始到下标5之前的子序列,[2, 3, 4, 9, 3]

f = a[:] # 取从开头到最后的整个子序列,相当于值拷贝,[2, 3, 4, 9, 3, 0, 1]

a[2:-2] = [1, 2, 3] # 赋值也可以按照一段来,[2, 3, 1, 2, 3, 0, 1]

g = a[::-1] # 也是倒序,通过slicing实现并赋值,效率略低于reverse()

a.sort()

print(a) # 列表内排序,a变为[0, 1, 1, 2, 2, 3, 3]

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

推荐阅读更多精彩内容