pandas选择部分数据,难!你该这么学,No.12

最近划水严重了

看了一下,上一篇博客,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. 整数,例如1,2,3,
  2. 整数列表或者数组[4,3,1]
  3. 切片对象,是整数
  4. 布尔数组
  5. 可回调函数

我们首先通过 iloc获取一下第2行的数据,索引当然是从0开始啦

df.iloc[1]

获取到的数据为`Series

在这里插入图片描述
切片你也可以自己试一下,没啥问题的

最后一步,Selection by callable

作为大佬的我,就不写了,你可以搜索一下,难度系数不大不小

啥叫不大不小呢
在这里插入图片描述
你如果会使用lambda就不大,不会就不小

机制的博主逻辑能力如何??

你还可以去上一篇博客,然后拉到最底部,发现一个好东西,然后掏出手机,拍一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章