栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pandas笔记之筛选

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pandas笔记之筛选

目录一览

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

文章目录
  • 目录一览
    • 1loc
    • 2多条件筛选
    • 3iloc
    • 4数值筛选
    • 5字符筛选
    • 6索引以及切片取值
    • 7query()函数
    • 8表达式
    • 9eval()
    • 10filter函数
    • 11where和mask函数
    • 12at和iat
    • 13any和all
    • 14isin(提取其他表该列)

1loc

使用的行索引名或者列属性直接来取数

选择一列或者多列

df['A']#选择一列
df[['A','B']]#选择多列

选择行loc

# 1、取出单个列
df.loc[:,"name"]  
# 2、取出多个列
df.loc[:,["name","age"]]  
#  3、使用数值,取出第一行,索引为0
df.loc[0]
# 4、取出索引为0,1,3的行记录,此时列字段是全部保留
df.loc[[0,1,3]]
df.loc[[0,1,3],:]  # 使用冒号:,表示全部列,效果同上
# 5、取出部分行和部分列
df.loc[[0,1,3],["name","sex","score"]]
# 6、!!!使用索引切片:同时包含起止位置
df.loc[0:3]
df.loc[:]  # 表示所有数据
# 7所有行的age及后面全部列
df.loc[:,"age":]
#8、部分行,age及其后面的全部列
df.loc[1:3,"age":]
# 9、针对非数值型行索引的取数
df.loc["语文"]#对行取数Series型数据
df.loc[["语文"]]#两个方括号取出的是DataFrame数据
df.loc[["语文","英语"]]
#10、取出部分行和列数据
df.loc[["语文","英语"],"小明"]  
# 指定我们需要的列属性名
df.loc[[1,2],["name","score"]]  
#选择连续和非连续的行(以索引标签为选择参数)
df.loc[20:60]#从索引20开始连续选择行到59,索引从0开始
#选择包含某个特定值的行(以具体行的值为参数)
df.loc[df.A=='a']#把A列里面为a的筛选出来

选择包含多个变量要求的行(各个变量之间要用圆括号括起来,汉字的条件要用名称索引法(中括号)而不能用点取法)

2多条件筛选
#指定数值筛选
df.loc[(df.A=='a')&(df['编码']=='001')]#且
df[(df['age']>10)|(df['age']<5)]#或
#数值形筛选
df[(df['age']>10)|(df['age']<5)]#或
#字符型筛选

选择包含多个变量条件的行和特定要求的列

df.loc[(df.A=='a')&(df['编码']=='001'),['列1','列2']

选择某一个元素值

df.loc[3,'A']#loc是按索引选取
df.iloc[3,1]#iloc是按位置选取
3iloc

iloc(行,列)是按位置选取的(方法跟loc类似)

df.iloc[:3]  # 取出前3行记录
df.iloc[[1,2,4]]  # 取出多行记录1,2,4
df.iloc[2,0:2]#取第二行,第1,2列
df.iloc[2,0:5:2] # 列方向上使用切片,步长为2 
df.iloc[2,[1,3]] # 行索引为2,列索引号为1 和 3可用列表
df.iloc[:, np.r_[0,2:4]]# 取出不连续的行列数据,使用np.r_
df.iloc[1:10,5:10]#行和列方向同时使用切片
4数值筛选
df.eq()    # 等于相等 ==
df.ne()    # 不等于 !=
df.le()    # 小于等于 >=
df.lt()    # 小于 <
df.ge()    # 大于等于 >=
df.gt()    # 大于 >

df[df.age.eq(20)] #age年龄值等于20 #其他同理
df[(df.df.age.ge(20))&(df.df.age.le(50))]#age年龄值大于等于20,age年龄值小于等于50
5字符筛选

字符类型数据的筛选主要是通过python和pandas中相关函数;

包含:str.contains
开始:str.startswith
结束:str.endswith

df[df['name'].str.contains('王')]#1名字里面包含王
df[df['name'].str.startswith('王')]#1名字开头王
df[df['name'].str.endswith('王')]#1名字结尾王

#如果字段中带有空值
#解决方法1:带上参数
df[df['name'].str.contains('王',na=False)]
#解决方法2:通过布尔值的比较判断
df[df['name'].str.contains('王')==True]
6索引以及切片取值

索引取数
直接通过某个索引值来取数,这种情况很少用
df[df.index==2]

切片取数
pandas中切片取数和Python中是相同的:
左边索引从0开始计数,右边索引从-1开始计数
切片规则:start:stop:step,分别表示起始位置start,结束位置stop,步长step(可正可负)
不包含结束索引位置的元素:含头不含尾,请记住索引切片的重要规则!!!

df[:2] #从头开始取到2(不含索引2)
df[2:5] #索引从2开始取到4.不含5
df[:-1]#从头开始取到倒数第二位 
df[-3:]#从倒数第三位开始取到最后
7query()函数
#1、使用数值型表达式
df.query('math > chinese > 110')
df.query('math + chinese > 255')
df.query('math == chinese')
df.query('(math > 110) and (chinese < 135)')  # 两个不等式

#2、使用字符型表达式
df.query('sex != "女"')  # 不等于女,就是全部男
df.query('sex not in ("女")')  # 不在女中就是男
df.query('sex in ("男","女")')   # 性别在男女中就是全部人

#3、传入变量;变量在使用的时候需要在前面加上@
# 设置变量
a = df.math.mean()
a

df.query('math > @a + 10')
df.query('math < (`chinese` + @a) / 2')
8表达式
#取反操作
df[~(df['sex'] == '男')]  # 取出不是男生的数据
#指定某个属性的值为具体的数据
df[df.sex == '男']  # 等同于 df[df['sex'] == '男']
#不等式表达式
df[df['math'] > df['chinese']]
#逻辑运算符
df[(df['math'] > 120) & (df['chinese'] < 140)]
9eval()
#1、使用数值型表达式
df.eval('math > 125')   # 得到的是bool表达式
df[df.eval('math > 125')]
df[df.eval('math > 125 and chinese < 130')]


#2、字符型表达式
df[df.eval('sex in ("男")')]

# 3、使用变量
b = df.chinese.mean()  # 求均值
df[df.eval('math < @b+5')]

10filter函数

使用方法:直接指定、正则指定、模糊指定、其中axis=1指定列名;axis=0指定索引

#1、直接指定属性名
df.filter(items=["chinese","score"])   # 列名操作
#直接指定行索引
df.filter(items=[2,4],axis=0)   # 行筛选

#2、通过正则指定
df.filter(regex='a',axis=1)  # 列名中包含
df.filter(regex='^s',axis=1)  # 列名以s开始
df.filter(regex='e$',axis=1)  # 列名以e结束
df.filter(regex='3$',axis=0)  # 行索引包含3

#3、模糊指定
df.filter(like='s',axis=1)   # 列名中包含s
df.filter(like='2',axis=0)   # 行索引包含2
# 同时指定列名和索引
df.filter(regex='^a',axis=1).filter(like='2',axis=0)
11where和mask函数

where:取出满足要求的数据,不满足的显示为NaN
mask:取出不满足要求的数据,满足的显示为NaN

s = df["score"]
s.where(s>=600)#不满足的显示为NaN
s.where(s>=610,600)  # 不满足条件的赋值为600
df.where((df.sex=='男') & (df.math > 125))

#mask函数
s.mask(s>=600)  # 和where相反:返回的都是小于600的数据
s.mask(s>=610, 600)  # 不满足条件的赋值为600 
#mask函数接受多个条件:
# 取值和where相反
df[(df.mask((df.sex=='男') & (df.math > 125)) == df).sex]
12at和iat
#at函数类似于loc,但是at函数取出的仅仅是一个值
df.at[4,"sex"]
df.at[2,"name"]
df.at['语文','小孙']# 同时指定索引和列名
df.loc[1].at['age']# at、loc连用
df.name.at[4]   #列名为name的第4个元素
#和iloc一样,仅仅支持对数字索引操作
df.iat[2,4]
df.loc[2].iat[4]
df.iloc[2].iat[4]
13any和all

any:如果至少有一个为True,则为True
all:需要所有结果为True,才会为True
当传入的axis=1,会按照行进行查询;axis=0表示按照列查询

 
14isin(提取其他表该列) 
#df表name列包含 name表种的index列全部筛选出来
df[df['姓名'].isin(name['index'].tolist())]
#包含,且需转化为字段
df.loc[df['姓名'].isin(list('BDH')),'平时成绩']=89
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923956.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号