完成本文用时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个多小时,还是感觉挺踏实的。您看到这里了吗? 那就点一下:在看
本文分享自 程序员郭震zhenguo 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!