日常用Python
做数据分析最常用到的就是查询筛选了,按各种条件、各种维度以及组合挑出我们想要的数据,以方便我们分析挖掘。
东哥总结了日常查询和筛选常用的种骚操作,供各位学习参考。本文采用sklearn
的boston
数据举例介绍。
from sklearn import datasets
import pandas as pd
boston = datasets.load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
![](https://filescdn.proginn.com/39489b06543db412c1388b1349c124e0/b7546a9da5c9a359797c95b3a1b52aa0.webp)
1. []
第一种是最快捷方便的,直接在dataframe的[]
中写筛选的条件或者组合条件。比如下面,想要筛选出大于NOX
这变量平均值的所有数据,然后按NOX
降序排序。
df[df['NOX']>df['NOX'].mean()].sort_values(by='NOX',ascending=False).head()
![](https://filescdn.proginn.com/32869c7ca0bc80ef114cb311c8cc13f5/c75d7d694cd8ae129b64df7aefdc9889.webp)
当然,也可以使用组合条件,条件之间使用逻辑符号& |
等。比如下面这个例子除了上面条件外再加上且条件CHAS为1
,注意逻辑符号分开的条件要用()
隔开。
df[(df['NOX']>df['NOX'].mean())& (df['CHAS'] ==1)].sort_values(by='NOX',ascending=False).head()
![](https://filescdn.proginn.com/7a0fe504ee5edff2a0d5446a80fcf881/3b82165ed9f22f0d7ccc6ff3a0c3a129.webp)
2. loc/iloc
除[]
之外,loc/iloc
应该是最常用的两种查询方法了。loc
按标签值(列名和行索引取值)访问,iloc
按数字索引访问,均支持单值访问或切片查询。除了可以像[]
按条件筛选数据以外,loc
还可以指定返回的列变量,从行和列两个维度筛选。
比如下面这个例子,按条件筛选出数据,并筛选出指定变量,然后赋值。
df.loc[(df['NOX']>df['NOX'].mean()),['CHAS']] = 2
![](https://filescdn.proginn.com/0defed06b3e1c00c714be58d14364959/5aca17e8ea3db563728162eb02c61fb1.webp)
3. isin
上面我们筛选条件< > == !=
都是个范围,但很多时候是需要锁定某些具体的值的,这时候就需要isin
了。比如我们要限定NOX
取值只能为0.538,0.713,0.437
中时。
df.loc[df['NOX'].isin([0.538,0.713,0.437]),:].sample(5)
![](https://filescdn.proginn.com/d1da5eb76badae772eddc69ca018656b/be3475b8f51873592501be1c474826c6.webp)
当然,也可以做取反操作,在筛选条件前加~
符号即可。
df.loc[~df['NOX'].isin([0.538,0.713,0.437]),:].sample(5)
![](https://filescdn.proginn.com/621ee60c1c9e47996a49793e1ad5e5ab/5a85af136a10a70598867fb08d0b1999.webp)
4. str.contains
上面的举例都是数值大小比较的筛选条件,除数值以外当然也有字符串的查询需求。pandas
里实现字符串的模糊筛选,可以用.str.contains()
来实现,有点像在SQL语句里用的是like
。
下面利用titanic的数据举例,筛选出人名中包含Mrs
或者Lily
的数据,|
或逻辑符号在引号内。
train.loc[train['Name'].str.contains('Mrs|Lily'),:].head()
![](https://filescdn.proginn.com/a8e709cd53d96b159a527867cb914cf9/a78766a5c0ec6b6451347907d3ab964f.webp)
.str.contains()
中还可以设置正则化筛选逻辑。
case=True:使用case指定区分大小写 na=True:就表示把有NAN的转换为布尔值True flags=re.IGNORECASE:标志传递到re模块,例如re.IGNORECASE regex=True:regex :如果为True,则假定第一个字符串是正则表达式,否则还是字符串
5. where/mask
在SQL里,我们知道where
的功能是要把满足条件的筛选出来。pandas中where
也是筛选,但用法稍有不同。
where
接受的条件需要是布尔类型的,如果不满足匹配条件,就被赋值为默认的NaN
或其他指定值。举例如下,将Sex
为male
当作筛选条件,cond
就是一列布尔型的Series,非male的值就都被赋值为默认的NaN
空值了。
cond = train['Sex'] == 'male'
train['Sex'].where(cond, inplace=True)
train.head()
![](https://filescdn.proginn.com/6359047ec33197bda96e90ce3a38104b/509365c9670394f9b65c590bf05b466f.webp)
也可以用other
赋给指定值。
cond = train['Sex'] == 'male'
train['Sex'].where(cond, other='FEMALE', inplace=True)
![](https://filescdn.proginn.com/029f2422beae4caa1cb4c09b7837a81e/0b4e2a94efb8a467389cacc4c6b2e469.webp)
甚至还可以写组合条件。
train['quality'] = ''
traincond1 = train['Sex'] == 'male'
cond2 = train['Age'] > 25
train['quality'].where(cond1 & cond2, other='低质量男性', inplace=True)
![](https://filescdn.proginn.com/a0e66f7fb728430ecfecb0635f9e20ee/9789fe139211a01395f08ecd67f0d5d5.webp)
mask
和where
是一对操作,与where
正好反过来。
train['quality'].mask(cond1 & cond2, other='低质量男性', inplace=True)
![](https://filescdn.proginn.com/65f831c25965759363fe54092cc29ed4/65685eb2e9eecaef155745047ad4816e.webp)
6. query
这是一种非常优雅的筛选数据方式。所有的筛选操作都在''
之内完成。
# 常用方式
train[train.Age > 25]
# query方式
train.query('Age > 25')
上面的两种方式效果上是一样的。再比如复杂点的,加入上面的str.contains
用法的组合条件,注意条件里有''
时,两边要用""
包住。
train.query("Name.str.contains('William') & Age > 25")
![](https://filescdn.proginn.com/4f77c5e65a2f9d7af5abbca7ab8d4655/38a4a6919298d0c6e9cd757aa800842f.webp)
在query
里还可以通过@
来设定变量。
name = 'William'
train.query("Name.str.contains(@name)")
7. filter
filter
是另外一个独特的筛选功能。filter
不筛选具体数据,而是筛选特定的行或列。它支持三种筛选方式:
items:固定列名 regex:正则表达式 like:以及模糊查询 axis:控制是行index或列columns的查询
下面举例介绍下。
train.filter(items=['Age', 'Sex'])
![](https://filescdn.proginn.com/481d9843ced9620baa65414bcb491986/6f78c76a3dd39ac1cfa04ccd1a322a5a.webp)
train.filter(regex='S', axis=1) # 列名包含S的
![](https://filescdn.proginn.com/e315733b115b13130f2d9e4b772c60a3/f38e06955c85f6293487628924e5ca20.webp)
train.filter(like='2', axis=0) # 索引中有2的
![](https://filescdn.proginn.com/f68c0c0a2b363eb90c4f0a4b5808abb1/9f5d344262c7acf20d2ae9bdc174887b.webp)
train.filter(regex='^2', axis=0).filter(like='S', axis=1)
![](https://filescdn.proginn.com/8150f014761acb1f27d7abc68ae0a101/03a8bb7efef194fa37c58ba9aec35065.webp)
8. any/all
any
方法意思是,如果至少有一个值为True
结果便为True
,all
需要所有值为True
结果才为True
,比如下面这样。
>> train['Cabin'].all()
>> False
>> train['Cabin'].any()
>> True
any
和all
一般是需要和其它操作配合使用的,比如查看每列的空值情况。
train.isnull().any(axis=0)
![](https://filescdn.proginn.com/c701ab6d7136d69fac28445df2271766/5c93bdaeeb195291f583b34809976c0c.webp)
再比如查看含有空值的行数。
>>> train.isnull().any(axis=1).sum()
>>> 708
参考:
[1] https://pandas.pydata.org/
[2] https://www.gairuo.com/p/pandas-selecting-data
[3] https://blog.csdn.net/weixin_43484764/article/details/89847241
近期文章
腾讯课堂 | Python网络爬虫与文本分析 中文金融情感词典发布啦 | 附代码 B站视频 | Python自动化办公 wordexpansion包 | 新增词向量法构建领域词典 语法最简单的微博通用爬虫weibo_crawler hiResearch 定义自己的科研首页 大邓github汇总, 觉得有用记得star whatlies包 | 简单玩转词向量可视化 multistop ~ 多语言停用词库 Jaal 库 轻松绘制动态社交网络关系图 SciencePlots | 科研样式绘图库 使用streamlit上线中文文本分析网站 爬虫实战 | 采集&可视化知乎问题的回答 Clumper | dplyr式的Python数据操作包 Clumper库 | 常用的数据操作函数 Clumper库 | Groupby具体案例用法 Clumper库 | 其他数据分析 plydata库 | 数据操作管道操作符>> plotnine: Python版的ggplot2作图库 读完本文你就了解什么是文本分析 文本分析在经管领域中的应用概述 综述:文本分析在市场营销研究中的应用 plotnine: Python版的ggplot2作图库 Wow~70G上市公司定期报告数据集 漂亮~pandas可以无缝衔接Bokeh YelpDaset: 酒店管理类数据集10+G