社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【Python】pandas 筛选数据的 8 个骚操作

机器学习初学者 • 2 年前 • 379 次点击  

肝了一个月的pandas进阶小册子出炉了👉「pandas进阶宝典


日常用Python做数据分析最常用到的就是查询筛选了,按各种条件、各种维度以及组合挑出我们想要的数据,以方便我们分析挖掘。

东哥总结了日常查询和筛选常用的种骚操作,供各位学习参考。本文采用sklearnboston数据举例介绍。

from sklearn import datasets
import pandas as pd

boston = datasets.load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)

1. []

第一种是最快捷方便的,直接在dataframe的[]中写筛选的条件或者组合条件。比如下面,想要筛选出大于NOX这变量平均值的所有数据,然后按NOX降序排序。

df[df['NOX']>df['NOX'].mean()].sort_values(by='NOX',ascending=False).head()

当然,也可以使用组合条件,条件之间使用逻辑符号& |等。比如下面这个例子除了上面条件外再加上且条件CHAS为1,注意逻辑符号分开的条件要用()隔开。

df[(df['NOX']>df['NOX'].mean())& (df['CHAS'] ==1)].sort_values(by='NOX',ascending=False).head()

2. loc/iloc

[]之外,loc/iloc 应该是最常用的两种查询方法了。loc按标签值(列名和行索引取值)访问,iloc按数字索引访问,均支持单值访问或切片查询。除了可以像[]按条件筛选数据以外,loc还可以指定返回的列变量,从行和列两个维度筛选。

比如下面这个例子,按条件筛选出数据,并筛选出指定变量,然后赋值。

df.loc[(df['NOX']>df['NOX'].mean()),['CHAS']] = 2

3. isin

上面我们筛选条件< > == !=都是个范围,但很多时候是需要锁定某些具体的值的,这时候就需要isin了。比如我们要限定NOX取值只能为0.538,0.713,0.437中时。

df.loc[df['NOX'].isin([0.538,0.713,0.437]),:].sample(5)

当然,也可以做取反操作,在筛选条件前加~符号即可。

df.loc[~df['NOX'].isin([0.538,0.713,0.437]),:].sample(5)

4. str.contains

上面的举例都是数值大小比较的筛选条件,除数值以外当然也有字符串的查询需求pandas里实现字符串的模糊筛选,可以用.str.contains()来实现,有点像在SQL语句里用的是like

下面利用titanic的数据举例,筛选出人名中包含Mrs或者Lily的数据,|或逻辑符号在引号内。

train.loc[train['Name'].str.contains('Mrs|Lily'),:].head()

.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或其他指定值。举例如下,将Sexmale当作筛选条件,cond就是一列布尔型的Series,非male的值就都被赋值为默认的NaN空值了。

cond = train['Sex'] == 'male'
train['Sex'].where(cond, inplace=True)
train.head()

也可以用other赋给指定值。

cond = train['Sex'] == 'male'
train['Sex'].where(cond, other='FEMALE', inplace=True)

甚至还可以写组合条件。

train['quality'] = ''
traincond1 = train['Sex'] == 'male'
cond2 = train['Age'] > 25

train['quality'].where(cond1 & cond2, other='低质量男性', inplace=True)

maskwhere是一对操作,与where正好反过来。

train['quality'].mask(cond1 & cond2, other='低质量男性', inplace=True)

6. query

这是一种非常优雅的筛选数据方式。所有的筛选操作都在''之内完成。

# 常用方式
train[train.Age > 25]
# query方式
train.query('Age > 25')

上面的两种方式效果上是一样的。再比如复杂点的,加入上面的str.contains用法的组合条件,注意条件里有''时,两边要用""包住。

train.query("Name.str.contains('William') & Age > 25")

query里还可以通过@来设定变量。

name = 'William'
train.query("Name.str.contains(@name)")

7. filter

filter是另外一个独特的筛选功能。filter不筛选具体数据,而是筛选特定的行或列。它支持三种筛选方式:

  • items:固定列名
  • regex:正则表达式
  • like:以及模糊查询
  • axis:控制是行index或列columns的查询

下面举例介绍下。

train.filter(items=['Age''Sex'])
train.filter(regex='S', axis=1# 列名包含S的
train.filter(like='2', axis=0# 索引中有2的
train.filter(regex='^2', axis=0).filter(like='S'


    
, axis=1)

8. any/all

any方法意思是,如果至少有一个值为True结果便为Trueall需要所有值为True结果才为True,比如下面这样。

>> train['Cabin'].all()
>> False
>> train['Cabin'].any()
>> True

anyall一般是需要和其它操作配合使用的,比如查看每列的空值情况。

train.isnull().any(axis=0)

再比如查看含有空值的行数。

>>> 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社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/156324
 
379 次点击