Pandas中兼并数组和字典功能的Series 2013-03-24 11:24:00

分类: Python/Ruby

In [2]:
# 这段代码用于并排显示多个Series对象
from itertools import izip_longest 
def C(*args, **kw): 
    gap = kw.pop("gap", 5) 
    results = [] 

    for item in args: 
        if isinstance(item, tuple): 
            results.append("\n".join(unicode(row) for row in item).split("\n")) 

    for i, item in enumerate(results): 
        width = max(len(row.encode("gb2312")) for row in item) 
        results[i].insert(1, "-"*width)
        results[i] = [row.encode("gb2312").ljust(width+gap).decode("gb2312") for row in item] 
    for row in izip_longest(*results, fillvalue=""): 
        print "".join(row) 

兼并数组和字典功能的Series

In [3]:
import pandas as pd 

Series对象本质上是一个NumPy的数组,因此NumPy的数组处理函数可以直接对Series进行处理。但是Series除了可以使用位置作为下标存取元素之外,还可以使用标签下标存取元素,这一点和字典相似。每个Series对象实际上都由两个数组组成:

  • index: 它是从NumPy数组继承的Index对象,保存标签信息。
  • values: 保存值的NumPy数组。

下面创建一个Series对象,并查看其两个属性:

In [4]:
s = pd.Series([1,2,3,4,5], index=["a","b","c","d","e"]) 
print s.index 
print s.values 

Index([a, b, c, d, e], dtype=object)
[1 2 3 4 5]

Series的下标存取,同时支持位置和标签两种形式:

In [5]:
print s[2], s["d"] 

3 4

Series也支持位置切片和标签切片。位置切片遵循Python的切片规则,包括起始位置,但不包括结束位置;但标签切片则同时包括起始标签和结束标签。之所以如此设计是因为在使用标签切片时,通常我们不知道标签的顺序,如果不包含结束标签,很难确定结束标签的前一个标签是什么。

In [6]:
C((u"s[1:3]", s[1:3]), (u"s['b':'d']", s['b':'d'])) 

s[1:3]     s['b':'d']
------     ----------
b    2     b    2
c    3     c    3
           d    4

和NumPy数组一样,Series也可以使用一个位置列表或者位置数组进行存取;同时还可以使用标签列表和标签数组。

In [7]:
C((u"s[[1,3,2]]", s[[1,3,2]]), (u"s[['b','d','c']]", s[['b','d','c']])) 

s[[1,3,2]]     s[['b','d','c']]
----------     ----------------
b    2         b    2
d    4         d    4
c    3         c    3

可以看出Series同时具有数组和字典的功能,因此它也支持一些字典的方法,例如Series.iteritems():

In [8]:
print list(s.iteritems()) 

[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]

Series魔法都在Index里

Index对象也是ndarray的派生类,values属性可以获得ndarray数组:

In [31]:
index = s.index 
print index.__class__.mro() 
index.values 

[, , ]

Out[31]:
array(['a', 'b', 'c', 'd', 'e'], dtype=object)

Index可以当作一维数组,支持所有的数组下标操作:

In [35]:
print index[[1, 3]] 
print index[index > 'c'] 
print index[1::2] 

Index([b, d], dtype=object)
Index([d, e], dtype=object)
Index([b, d], dtype=object)

Index也具有字典的映射功能,它将数组中的值映射到其位置:

  • Index.get_loc(value): 获得单个值value的下标
  • Index.get_indexer(values): 获得一组值values的下标,当值不存在时,得到-1
In [43]:
print index.get_loc('c') 
index.get_indexer(['a', 'c', 'z']) 

2

Out[43]:
array([ 0,  2, -1])

Index的魔法在Engine里

Index对象的字典功能由其中的Engine对象提供:

In [18]:
e = s.index._engine 
print e 

In [22]:
e.get_loc('b') 

Out[22]:
1

In [42]:
e.get_indexer(np.array(['a', 'd', 'e', 'z'], 'O')) 

Out[42]:
array([ 0,  3,  4, -1])

Engine中的HashTable

Engine对象的字典功能由mapping提供:

In [19]:
ht = e.mapping 
print ht 

In [53]:
ht.get_item('d') 

Out[53]:
3

In [55]:
ht.lookup(np.array(['a', 'd', 'e', 'z'], 'O')) 

Out[55]:
array([ 0,  3,  4, -1])

值不唯一的Index

当Index中的每个值都唯一时,可以使用HashTable将值映射到其位置之上。若值不唯一,则Pandas会采用两种较慢的算法。

  • 值唯一时,采用HashTable映射,复杂度为O(1),但需要额外的内存保存HashTable
  • 值排序时使用二分搜索法,复杂度为O(log2(N))
  • 值无序时则逐个比较,复杂度为O(N)

在Pandas的内部实现中,还考虑了内存的因素,因此对于较大的、排序的、值唯一的Index,也会采用二分搜索法,省去了由HashTable带来的额外内存开销。

下面我们创建这三种Index对象:

In [80]:
N = 10000 
unique_keys = np.array(list(set(pd.core.common.rands(5) for i in xrange(N))), 'O') 
duplicate_keys = unique_keys.copy() 
duplicate_keys[-1] = duplicate_keys[0] 
sorted_keys = np.sort(duplicate_keys) 
unique_index = pd.Index(unique_keys) 
sorted_index = pd.Index(sorted_keys) 
duplicate_index = pd.Index(duplicate_keys) 
to_search = unique_keys[N-2] 

每个Index都有is_unique和is_monotonic属性,分别表示值是否唯一,和是否排序。下面的程序显示上面三个Index对象的属性:

In [101]:
from itertools import product 
def dataframe_fromfunc(func, index, columns): 
    return pd.DataFrame([[func(idx, col) for col in columns] for idx in index], 
            index = index, columns = columns) 
predicates = ["is_unique", "is_monotonic"] 
index = ["unique_index", "sorted_index", "duplicate_index"] 
dataframe_fromfunc(lambda idx, pred:getattr(globals()[idx], pred), index, predicates) 

Out[101]:
  is_unique is_monotonic
unique_index True False
sorted_index False True
duplicate_index False False

所有的Index都支持get_loc(),但只有值唯一的Index才支持get_indexer()。三者的get_loc()方法所返回的位置信息也不同:

  • unique_index:由于值是唯一的,因此返回一个整数
  • sorted_index:由于值是排序的,因此返回一个slice对象
  • duplicate_index:返回一个布尔数组

这三种返回值都可以作为下标存取ndarray中的值。

In [103]:
print unique_index.get_loc(unique_keys[0]) 
print sorted_index.get_loc(unique_keys[0]) 
print duplicate_index.get_loc(unique_keys[0]) 

0
slice(8528, 8530, None)
[ True False False ..., False False  True]

下面比较三者的运算速度:

In [81]:
%timeit unique_index.get_loc(to_search) 

1000000 loops, best of 3: 828 ns per loop

In [82]:
%timeit sorted_index.get_loc(to_search) 

100000 loops, best of 3: 15.2 us per loop

In [83]:
%timeit duplicate_index.get_loc(to_search) 

1000 loops, best of 3: 284 us per loop

Pandas中兼并数组和字典功能的Series 2013-03-24 11:24:00 分类: Python/Ruby In [2]: # 这段代码用于并排显示多个Series对象 from it相关推荐

  1. python 数列筛选_对numpy中的数组条件筛选功能详解

    在程序设计中,时常会遇到数据的唯一化.相同.相异信息的提取等工作,在格式化的向量存储矩阵中南,numpy能够提供比较不错的快速处理功能. 1,唯一化的实现: In [63]: data = np.ar ...

  2. 绑定dictionary 给定关键字不再字典中_VBA数组与字典解决方案第51讲:字典嵌套及二级下拉菜单的制作...

    大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解第51讲:对字典嵌套的理解及二级下拉菜单的制作. 在讲字典的时候,我反复说明,字典看视非常简单,由于它具有直达性可以省略去我们大量的循环查找代 ...

  3. pandas中强大的绘制图表功能——DataFrame.hist(),以及统计分析函数——DataFrame.describe()

    pandas中具有很多很强大的图表绘制功能,今天介绍一个简单好用的绘制数据框DataFrame中某一列数据分布直方图的函数--DataFrame.hist(),顺便介绍一个统计分析函数DataFram ...

  4. stl标准模板库_C ++标准模板库(STL)中的数组及其常用功能

    stl标准模板库 "array" is a container in C++ STL, which has fixed size, which is defined in &quo ...

  5. javascript字典中添加数组_Javascript 数组与字典

    Javascript 的数组Array,既是一个数组,也是一个字典(Dictionary). 先举例看看数组的用法. var a = new Array(); a[0] = "Acer&qu ...

  6. Pandas中map,applymap和apply方法之间的区别

    本文翻译自:Difference between map, applymap and apply methods in Pandas Can you tell me when to use these ...

  7. dataframe groupby_详解pandas中的map、apply、applymap、groupby、agg.

    一.简介 pandas提供了很多方便简洁的方法,用于对单列.多列数据进行批量运算或分组聚合运算,熟悉这些方法后可极大地提升数据分析的效率,也会使得你的代码更加地优雅简洁. 本文就将针对pandas中的 ...

  8. python查看dataframe数据类型_python pandas中DataFrame类型数据操作函数的方法

    python数据分析工具pandas中DataFrame和Series作为主要的数据结构. 本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数. 1)查看DataFrame数 ...

  9. accdb原有的数据怎么清除_VBA中利用数组对数据批量处理的方法

    大家好,今日继续和大家分享VBA编程中常用的常用"积木"过程代码.这些内容大多是我的经验和记录,来源于我多年的经验.今日分享的是NO.225-NO.226,内容是: NO. 225 ...

最新文章

  1. 插件和代码两种方法搞定WordPress回复邮件通知
  2. 从C语言学习谈编程之路
  3. 博士申请 | 约翰霍普金斯大学招收2022年入学trustworthy AI方向博士生
  4. 2018-2019-1 20165234 《信息安全系统设计基础》第四周学习总结
  5. js判断对象还是数组
  6. 蓝桥杯 单点最短路径问题
  7. [VB]数据库导入到 CSV 格式文件
  8. TortoiseSVN中Branching和Merging实践
  9. Linux新手入门教程
  10. 连载IT小说《失业的程序员》讲述一个Android开发者的奋斗史
  11. 程序员转正述职报告_程序员个人述职报告范文4篇(整理版)
  12. 淘宝 喵铺脚本自动签到脚本
  13. 三次握手与四次挥手的爱恨情仇
  14. Unity3D专区Unity实现加载场景进度条
  15. 数字音频接口之TDM
  16. nofollow标签使用方法
  17. vue watch监听中 immediate, deep, hander的作用
  18. JAVA之模拟注册登录幸运抽奖
  19. C语言中指针的介绍(终极版!!!)
  20. Ubuntu 18.04 网易云音乐无法打开问题解决方案

热门文章

  1. python3.6 3.7共存_[转]CentOS 7安装Python3.6过程(让linux系统共存Python2和Python3环境)...
  2. php中pre标签,html中pre标签与code标签的作用与用法
  3. gitlab更新配置无效_GitMaster 发布 v1.11.0 版本,支持 GitLab 多级分组,Gist支持文件列表...
  4. pymysql 写入数据
  5. TensorFlow 莫烦视频学习笔记例子二(一)
  6. python库整理:networkx 包
  7. R语言问题剖析20篇(一)-R语言泛函式编程purrr实现优雅循环迭代
  8. tableau实战系列(六)-小面积图表如何完整显示标签
  9. MATLAB实战系列(一)-二维路径规划算法续集-图像边缘提取(附代码)
  10. 强化学习(三)用动态规划(DP)求解