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

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

今天,聊聊 [] 操作符。

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

a= [1, 3, 5]# 以下OK:a[1]a[True]a[:2]a[:6]# 不OK:a[[1,2]]

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

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

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 对象,注意这种支持也仅仅是对列索引;对于行索引,依然不支持。

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

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

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

df1[1:3]#结果   c1  c2  c3r2  1  1  2r3  8  7  3

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

df1['r1':'r3']#结果  c1  c2  c3r1  6  9  6r2  1  1  2r3  8  7  3

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

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

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

     c1  c2  c3r1  True  True  Truer2  False  False  Falser3  True  True  Falser4  True  True  False

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

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 实例:

inner = ((df1>4).values).tolist()inner#结果,类型是list[[True, True, True], [False, False, False], [True, True, False], [True, True, False]]

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

df1[inner]#结果 ???

您想到了吗?

答案:

   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个多小时,还是感觉挺踏实的。您看到这里了吗? 那就点一下:在看

原文发布于微信公众号 - Python与机器学习算法频道(alg-channel)

原文发表时间:2019-03-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券