前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊 [ ] 操作符,最后引出一个看似.....

聊聊 [ ] 操作符,最后引出一个看似.....

作者头像
double
发布2019-05-07 18:17:27
4260
发布2019-05-07 18:17:27
举报
文章被收录于专栏:算法channel

完成本文用时80分钟,全文1700+字

今天,聊聊 [] 操作符。

原生Python中,[] 操作符常见的是与 list 搭配使用,并且 [] 操作符支持的对象只能是:整形,切片,list等可迭代对象是禁止的。例如:

代码语言:javascript
复制
a= [1, 3, 5]# 以下OK:a[1]a[True]a[:2]a[:6]# 不OK:a[[1,2]]

为了更好地发挥 Python 的强大威力,有了数据分析常用包Pandas,它就让 [] 操作符支持 list对象。

为了演示这个点,我们先生成一个DataFrame实例 df1

代码语言:javascript
复制
import pandas as pdimport numpy as  np
np.random.seed(1)df1=pd.DataFrame(np.random.randint(1,10,(4,3)),index=['r1','r2','r3','r4'],columns=['c1','c2','c3'])
#结果  c1  c2  c3r1  6  9  6r2  1  1  2r3  8  7  3r4  5  6  3

[] 操作符这样支持 list 对象,注意这种支持也仅仅是对列索引;对于行索引,依然不支持。

代码语言:javascript
复制
df1[['c1','c3']]#测试支持列索引  c1  c3r1  6  6r2  1  2r3  8  3r4  5  3
df1[['r1', 'r4']]#测试结果,会出现以下报错:

至于为什么Pandas要这么做,大家可以在留言区发表看法。

利用行切片整数索引,获取数据帧,Pandas依然延续了原生Python的风格,如下:

代码语言:javascript
复制
df1[1:3]#结果   c1  c2  c3r2  1  1  2r3  8  7  3

Pandas还对此做了增强,同时支持:行切片标签索引,获取数据帧,如下,注意包括终止标签

代码语言:javascript
复制
df1['r1':'r3']#结果  c1  c2  c3r1  6  9  6r2  1  1  2r3  8  7  3

[] 操作符除了支持以上对象类型外,还支持哪些对象类型? 总感觉缺点什么! 它还支持:DataFrame

先问您一下:您知道 df1 > 4 返回的类型是什么吗?

答案: DataFrame实例,结果如下,元素取值不难理解。

代码语言:javascript
复制
     c1  c2  c3r1  True  True  Truer2  False  False  Falser3  True  True  Falser4  True  True  False

既然 [] 操作符支持 DataFrame实例,那么返回的结果您一定想知道:

代码语言:javascript
复制
df1[ df1 > 4 ]#结果如下:    c1  c2  c3r1  6.0  9.0  6.0r2  NaN  NaN  NaNr3  8.0  7.0  NaNr4  5.0  6.0  NaN

看到结果,可能不用解释,您也知道怎么回事了。

下面,引出一个奇怪的问题,大家可以回去思考。这个操作的readable不是很好,所以觉得此操作很奇怪。

上面讲到,[] 操作符支持DataFrame实例,不过,如果我们剥去它的层层外衣,直奔最本质,揪出它后就是一个 list 实例:

代码语言:javascript
复制
inner = ((df1>4).values).tolist()inner#结果,类型是list[[True, True, True], [False, False, False], [True, True, False], [True, True, False]]

接下来,就是见证奇迹的时刻:

代码语言:javascript
复制
df1[inner]#结果 ???

您想到了吗?

答案:

代码语言:javascript
复制
   c1  c2  c3r1  6  9  6r1  6  9  6r1  6  9  6r3  8  7  3r3  8  7  3r4  5  6  3r4  5  6  3

差不多,您也可以解释为什么结果是这样了吧!今天,只想尽量聊透 [] 操作符访问数据这个知识点,当然还有更多的访问数据的函数,比如iloc, loc等。 欢迎留言,畅所欲言。

难得早下班,静下心来,书写1个多小时,还是感觉挺踏实的。您看到这里了吗? 那就点一下:在看

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档