文章目录

  • 一、 筛选指定的列
  • 二、 按照条件筛选
  • 2.1 单条件筛选
  • 2.2 多条件组合筛选


创建一个DataFrame

import pandas as pd
data = {'name':['张三', '李四', '王五', '赵六'],'age':[20, 21, 22, 23], 'gender': [0, 1, 1, 1], 'stature': [165, 189, 178, 160], 'year': [2000, 2002, 2003, 1993]}
df = pd.DataFrame(data)
print (df)

运行结果如下:

name  age  gender  stature  year
0   张三   20       0      165  2000
1   李四   21       1      189  2002
2   王五   22       1      178  2003
3   赵六   23       1      160  1993

常用的筛选方法:

  • []:直接在DataFrame的[]中写筛选条件或者组合条件,组合条件之间可以使用逻辑符号& |
  • loc/ilocloc按照标签值(列名和行索引取值)访问,iloc按照数字索引访问,均支持单值访问或切片查询,除此之外,loc还可以指定返回的列变量
  • isin:当查询条件不是一个取值范围,而是一些具体的值,就需要使用isin了,也可以做取反操作,在筛选条件前加~
  • str.contains:实现字符串的模糊筛选,类似sql语句中的like
  • where:接受的条件需要是布尔型,如果不满足条件,会被赋值为默认的NaN或者指定其他值
  • query:所有的筛选条件要在' '之内
  • filter:不筛选具体数据,而是筛选特定的行或列
  • any:如果至少有一个值为True,结果便是True。一般需要和其他操作配合使用,比如查看每列的空值情况
  • all:需要所有的值都为True,结果才为True

一、 筛选指定的列

筛选name

# 1. 直接筛选,返回的是Series类型
df['name']

# 2. 使用loc筛选,返回的是DataFrame类型
df.loc[:, ['name']]

# 3. 使用filter,返回的是DataFrame类型
df.filter(items=['name'])

查询结果如下:

mysql 筛选不符合手机号规则的 不符合筛选条件_python

筛选namestature

# 1. 直接筛选
df[['name', 'stature']]

# 2. 使用loc筛选
df.loc[:, ['name', 'stature']]

# 3. 使用filter
df.filter(items=['name', 'stature'])

查询结果如下:

mysql 筛选不符合手机号规则的 不符合筛选条件_开发语言_02

二、 按照条件筛选

2.1 单条件筛选

筛选姓名为王五的所有行

# 1. 直接筛选
df[df['name']=='王五']

# 2. 使用loc筛选
df.loc[df['name']=='王五']

# 3. 使用query查询,注意条件里有''时,两边要用""包住。
df.query("name=='王五'")

查询结果如下:

mysql 筛选不符合手机号规则的 不符合筛选条件_python_03

2.2 多条件组合筛选

筛选gender为1,并且姓名为王五的所有行

# 1. 直接筛选
df[(df['name']=='王五') & (df['gender']==1)]

# 2. 使用loc筛选
df.loc[(df['name']=='王五') & (df['gender']==1)]

# 3. 使用query查询,注意条件里有''时,两边要用""包住。
df.query("name=='王五' & gender==1")

查询结果如下:

mysql 筛选不符合手机号规则的 不符合筛选条件_pandas_04


筛选gender为1,并且姓名为王五赵六的所有行

# 1. 直接筛选
df[(df['name']=='王五') | (df['name']=='赵六') & (df['gender']==1)]

# 2. 使用loc筛选
df.loc[(df['name']=='王五') | (df['name']=='赵六') & (df['gender']==1)]

# 3. 使用query查询,注意条件里有''时,两边要用""包住。
df.query("name=='王五' | name=='赵六' & gender==1")

# 4. 使用isin()筛选
df[df['name'].isin(['王五', '赵六']) & (df['gender']==1)]

mysql 筛选不符合手机号规则的 不符合筛选条件_pandas_05


筛选name中包含的所有行

# 使用str.contains来筛选
df[df['name'].str.contains('王')]

查询结果如下:

mysql 筛选不符合手机号规则的 不符合筛选条件_字符串_06


筛选name中包含的所有行

# 使用str.contains来筛选
df[df['name'].str.contains('王|赵')]

查询结果如下:

mysql 筛选不符合手机号规则的 不符合筛选条件_python_07


查看每列的空值情况:

# 1. 查看每列是否有空值
df.isnull().any(axis=0)

'''
name       False
age        False
gender     False
stature    False
year       False
dtype: bool
'''

# 2. 查看含有空值的行数
df.isnull().any(axis=1).sum()
# 0

如上按照条件筛选基本可以满足日常开发需要,pandas中条件筛选比较灵活,还有很多情况没有演示,大家可以自行组合各种筛选条件进行尝试。