资源描述
用Pandas对数据进行复杂查询,7步教你随心所欲地
取用数据
导读:在数据分析和数据建模的过程中需要对数据进行清洗和整理等工作,有时 需要对数据增删字段。本文将介绍Pandas对数据的复杂查询。
实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据。本文将介绍如
何发挥Pandas数据筛选的无限可能,随心所欲地取用数据。
01逻辑运算
类似于Python的逻辑运算,我们以DataFrame其中一列进行逻辑计算,会产生
一个对应的由布尔值组成的Series ,真假值由此位上的数据是否满足逻辑表达式
决定。例如下例中索引为0的数据值为89,大于36 ,所以最后值为True。
1# Q1成绩大士 36
2df .Q1>^6^H
16Name: QI, Length: 100, dtype: bool
一个针对索引的逻辑表达式会产生一个array类型数组,该数组由布尔值组成。
根据逻辑表达式,只有索引为1的值为True ,其余全为False。
1#索引等于工
2df,index == 1
4array([False,
True, False, False, False, False, False, False, False,
5
False,
False, False, False, False, False, False, False, False,
6
False,
False, False, False, False, False, False, False, False,
7
False,
False, False, False, False, False, False, False, False,
False,
False, False, False, False, False, False, False, False,
9
False,
False, False, False, False, False, False, False, False,
10
False,
False, False, False, False, False, False, False, False,
False,
False, False, False, False, False, False, False, False)
12
False,
False, False, False, False, False, False, False, False,
False,
False, False, False, False, False, False, False, False,
14
False,
False, False, False, False, False, False, False, False,
15
16-
False])
再看一下关于DataFrame的逻辑运算,判断数值局部的所有值是否大于60 ,满足表达式的值显示为True ,不满足表达式的值显示为False。
1# df.loc[: JQ「:,Q4」部空取数字局部,否那么会因字符无大于运算而报错I 2df .loc[: JQ1‘:
三 1T「「「二"三 口 ―二 T
.F ―, 二」三二 F」二F :
/11 2;:二;「; I ! w 1 s c I i
♦?।「「「 -」、」「। 不
〔〕♦I-I- I .Isr ।:ir1。
‘」":,";」「: . L,「「; L:.「L U /I「:」「」「! . 1、c-
1/ : 8「L .,.;」o F . k o T1 三 三 :「口「三 口「二」三二,「」三 c’
16 [100 rows x 4除了逻辑运算,Pandas还支持组合条件的Python位运算:
屋,
1# Q1成绩不小于60分,并且是C组成员
2〜(df.Ql < 60) & (dfUteam1
15Length: 100, dtype: bool02逻辑筛选数据 切片(口)、.loc口和.iloc口均支持上文所介绍的逻辑表达式。通过逻辑表达式进行 复杂条件的数据筛选时需要注意,表达式输出的结果必须是一个布尔序列或者符 合其格式要求的数据形式。例如,df.iloc口+ 1]和df.iloc[lambda df: len(df)-l] 计算出一个数值,符合索引的格式,df.iloc[df.index= = 8]返回的是一个布尔序列, €^1农口自向0刈返回的是一个索引,它们都是有效的表达式。
以下是切片(口)的一些逻辑筛选的例如:
2df[~(df['Ql'] == 8)] # 不等7「, 3df[df.name 二='Ben'] # 姓名为 Ben| 4df[df>Ql以下是」OC口和Jie口的一些例如:
i#太达」弋二切片「效
d千」'Q1 :「93, 'Q「二一 d"oc「(df.Q1 > 80) & (df.Q2 < 15)]
5df.loc[df「Ql']二二 8^ 二6df.loc[df.Ql =二
7df.loc[df[,Ql,] > 90, 'QI':] # Q1大于90,显示Ql及其后所有列需要注意的是在进行或(| )、与(& )、非(~ )运算时,各个独立逻辑表达式 需要用括号括起来。
any和all对逻辑计算后的布尔序列再进行判断,序列中所有值都为True时all 才返回True ,序列中只要有一个值为True时any就返回Trueo它们还可以传入 axis参数的值,用于指定判断的方向,与Pandas的axis参数整体约定一样,默 认为0列方向,传入I为行方向。利用这两个方法,我们可以对整体数据进行逻 辑判断,例如:
1# QI、Q2成绩全为超过80分的2df[(df.loc[: J'Ql1 JQ21]] > 80).an(1)]
3# QI、Q2成绩至少有二不超过80分而4df[(df.loc[: J'Ql'JQ2']] > 80).any(l)]
上例对两个列整体先做逻辑计算得到一个两列的布尔序列,然后用all和any在 行方向上做逻辑计算。
03函数筛选可以在表达式使用lambda函数,默认变量是其操作的对象。如果操作的对象是 一个DataFrame ,那么变量就是这个DataFrame ;如果是一个Series ,那么就 是这个Serieso可以看以下例子,s就是指df.Ql这个Series :
1#查询最大索引的值2df ,Ql[lambda s: max(s・index)] # 值为 2
Name: QI, dtype:
F面是一些例如:
ldf[lambda df: df「Ql[ == 8] # e 夫。^2df.loc [lambda df: df.Ql == 8, 'QI1:©'[# QI 为 8 的,、也
3df・loc[:, lambda df: df.colunins・st:r・len()==4] # 由真彳段值组成^ 4df・loc[:‘ lambda df: [i 「or i in df.columns i「 p' in i]] # 列名列, 5df.iloc[:3^ lambda df: df.columns.str. len()==2] # 由真假值组成的序列04比拟函数
Pandas提供了一些比拟函数,使我们可以将逻辑表达式替换为函数形式。
1#以下相当于df[dtQ:L == 60]・ 2df [ df, QI.
4nameteamQIQ2Q3Q4520Lucas A60417762
除了.eq(),还有:
ldf.ne() # 不等2df.le() # 小于等了 <=
3df,lt()4df・ge() #大于等
5df.gt() #使用例如如下:
1 [df .Ql.ne(89)] #不:"-2df ,loc[df >Q1.gt(90) & df .Q2.lt(90)] # (nd 关系,QC>90, Q2<90
这些函数可以传入一个定值、数列、布尔序列、Series或DataFrame,来与原数据比拟。
另外还有一个.isin()函数,用于判断数据是否包含指定内容。可以传入一个列表, 原数据只需要满足其中一个存在即可;也可以传入一个字典,键为列名,值为需 要匹配的值,以实现按列个性化匹配存在值。
2df [ df .
3df[df.isin({'team, : ['C\ 'QI' : [36,93]})] # 复杂查询,其他值为 NaF05 查询 df.queryO
df.query(expr)使用布尔表达式查询DataFrame的列,表达式是一个字符串,类似于SQL中的where从句,不过它相当灵活。
ldf .query(' QI > Q2 > 901) # il接写类型 SQL where 语句2df .query('QI + Q2
4df .query(' (Ql<50) 丁7赤/5df .query (
df. query (7df.query( t-
8# -E —— . u①、还支持使用@符引入变量:
1#支持传入变量,女仁于平均分40分的| a _ dLQRu-1不df.eval()与df.queryO类似,也可以用于表达式筛选:
2df[df.eval(”Q1 > 90 > Q3 > 10”)]3df[df.eval(”Ql >、Q7颉
06 筛选 df.filterQdff lter()可以对行名和列名进行筛选,支持模糊匹配、正那么表达式。
ldf. filter (items 二'Q2' ])3df .filte「(regex='e$ ' j axis=l) # 以 e
df .filter(regex='1$ \ axis=0)5df.filter(like=‘2" axis=0)# 索小中仃 2 7
6#索引中以2开头、列名有获7df・filter(regex='八2', axis=0).filter(like='Q', axis=1)
07按数据类型查询Pandas提供了一个按列数据类型筛选的功能df.select_dtypes(include = Nonez exclude = None),它可以指定包含和不包含的数据类型,如果只有一个类型,传 入字符;如果有多个类型,传入列表。
ldf. select_dtypes(include=[ ,float64, ]) # 选择 float64 型数据
二一」「I「「_ d :了「:「「",n三df . select dtvoeslexclude二「' datetime64' ]
如果没有满足条件的数据,会返回一个仅有索引的DataFrameo08小结
本文介绍了如何实现复杂逻辑的数据查询需求,复杂的数据查询功能是Pandas 的杀手铜,这些功能Excel实现起来会比拟困难,有些甚至无法实现,这正是 Pandas的优势所在。
-END -
展开阅读全文