最近划水严重了
看了一下,上一篇博客,6月11日写的,一晃一个月+10天过去了
这两个月,严重的挑衅了劳动法
每周从周一,工作到周日,每天从早上8点,忙到晚上23:00
哪个大佬,给个渠道
投诉一下老板…
工作一忙,就溜号了,回头跟老板说说,都没时间写博客
刷存在感了
看了一下,pandas这个系列的博客还没有写完,so继续拿这个开始吧
断更了一段时间,需要找找状态
今天就从索引和检索数据开始
这个简单吧,写写你就知道了,
哪里有简单的事情
索引选择的几种方式
pandas支持三种类型的多轴索引
类型 | 简单描述 |
---|---|
.loc | 基于标签 |
.iloc | 基于位置 |
[ ] | 切片操作 |
那么我们先讲 .loc吧
这个是基于标签的,啧啧啧,什么是标签
看图
import pandas as pd
my_series = pd.Series(data = ['我','是','梦想','橡皮擦'],index=['a','b','c','d'],name='梦想序列')
print(my_series)
就是代码里面的index
,是不是清晰明了了?
.loc
就是操作楼上这东西的
它有哪些取值呢,这就多了,官方手册给了5个
我们细细的品读一下
1st. 看我这英文水平
1st. 单独的一个标签,例如2
或者'a'
,请注意这个地方的2是索引的标签值,不是整数的位置
啥意思,看操作
我截取了部分代码
注意,loc['b']
对应的是b行,loc[2]
对应的是2行,这个2可不是索引2,实打实的是 index 的 label 2
当然这个地方,我只是单纯的做个测试,index的label建议是字符串哦
或者,你要不都是字符串,要不都是整数,明白乎?
这样方便后面的许多运算滴
2nd. 一个标签列表
这个就好解释了
# 获取2行
print(my_series.loc[['a','b']])
你看,得到结果了吧,但是,请注意 .loc[]
里面是标签列表,所以要写成 .loc[['a','b']
]
别弄差了 写成 .loc[‘a’,‘b’]
会报错的哦~
3rd. 一个切片对象例如标签 'a':'d'
这个地方有一个要注意,在python列表索引中
切片是不包括结尾的,但是这个地方包括哦
例子如下
# 获取a~d行
print(my_series.loc['a':'d'])
4th. 一个布尔数组,这个和2nd像哦
当碰到数组中是True,就打印出来,简单吧
不过,请记住,不要超过数组的长度
print(my_series.loc[[True,False,True,True]])
还有,记住这个地方,可别自作聪明的认为True等价于1
把上面的代码转换成
具体原因,看2nd去吧
5th. 第5个就比较厉害了,可以放一个函数,这个函数有一个参数,参数类型是 Series, DataFrame,Panel中的一个,还要返回上述的几个类型
恩,有点难度,常规套路
不想写了
…
后来想想,不写还能叫大佬么
写出来给你看看
import pandas as pd
my_series = pd.Series(data = ['我','是','梦想','橡皮擦'],index=['a','b','c','d'],name='梦想序列')
def fun():
return 'a';
print(my_series.loc[fun()])
这个地方补充一个知识点
如果比较一个series对象一个字符串,会出现一个什么样的结果呢
例如
比较刚才的my_series
和我
my_series = pd.Series(data = ['我','是','梦想','橡皮擦'],index=['a','b','c','d'],name='梦想序列')
print(my_series == '我')
得到的结果是还是一个Series
但是每个值的类型都变成了bool,这样子,我们可以做一些下面的操作了
运行下面的代码,领悟里面的精髓吧,哈哈哈
def fun():
return 'a';
def fun1():
return ['a','b'];
def fun2(s):
return s=="我"
print(my_series.loc[fun()])
print(my_series.loc[fun1()])
print(my_series.loc[fun2(my_series)])
当然,还可以使用lamda表达式,毕竟上面的函数体还是有点简单的吗
print("*"*100)
print(my_series.loc[fun()])
print(my_series.loc[lambda s:'a'])
print("*"*100)
print(my_series.loc[fun1()])
print(my_series.loc[lambda s:['a','b']])
print("*"*100)
print(my_series.loc[fun2(my_series)])
print(my_series.loc[lambda s:s=='我'])
安排的明明白白
相同的操作,除了给series使用之外,对于我们来说dataframe才是正戏呢
df = pd.DataFrame([[4,8,3],[5,6,1],[1,9,2]],columns=['boys','girls','guys'],index=['class2','class1','class3'])
def fuu(df):
return df['boys']>2
print(df.loc['class1'])
print(df.loc[['class1','class2']])
print(df.loc[fuu(df)])
print(df['boys']>2)
看细节了没,df操作和series是一致的哦
还有,我在上面的代码中写了一个df['boys']>2
哦,看一下返回的结果吧
如果你喜欢,你可以自己尝试一下lamda的用法,也很简单的哦
小提示
当你选择完数据之后,如果数据还是多行的,其实可以继续选择的
print(my_series.loc[lambda s:['a','b']]['a'])
# 或者
print(my_series.loc[lambda s:['a','b']].loc['a'])
.loc
用在dataframe上,还可以这么操作,请查收
df = pd.DataFrame([[4,8,3],[5,6,1],[1,9,2]],columns=['boys','girls','guys'],index=['class2','class1','class3'])
print(df.loc[:,:]) # 切片,逗号前是index,后面是columns
print(df.loc[:,'boys':'girls'])
print(df.loc[['class1','class2'],['boys']])
技术在手,想怎么写就怎么写
继续第二种
这种如果你去官方文档检索,称作 Selection by Position
pandas提供了一套方法,用整数索引获取数据
索引使用和列表中切片保持一致,基于–based索引,当切片时,左闭右开。
.loc
主要访问方法
- 整数,例如1,2,3,
- 整数列表或者数组[4,3,1]
- 切片对象,是整数
- 布尔数组
- 可回调函数
我们首先通过 iloc
获取一下第2行的数据,索引当然是从0开始啦
df.iloc[1]
获取到的数据为`Series
切片你也可以自己试一下,没啥问题的
最后一步,Selection by callable
作为大佬的我,就不写了,你可以搜索一下,难度系数不大不小
啥叫不大不小呢
你如果会使用lambda就不大,不会就不小
机制的博主逻辑能力如何??
你还可以去上一篇博客,然后拉到最底部,发现一个好东西,然后掏出手机,拍一下