pandas dataframe loc多条件筛选

pandas dataframe loc多条件筛选

参考:pandas dataframe loc multiple conditions

在数据分析过程中,我们经常需要根据一些条件来筛选数据。Pandas库提供了多种筛选数据的方法,其中loc是最常用的一种。loc可以根据行标签和列标签来选取数据,而且还可以接受多个条件。本文将详细介绍如何使用loc进行多条件筛选。

1. 基本用法

loc的基本用法是df.loc[行条件, 列条件],其中df是一个DataFrame对象。行条件和列条件可以是标签名,也可以是返回布尔值的表达式。如果省略列条件,那么将选取所有列。

例如,我们有一个包含用户信息的DataFrame,如下:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)
printf(df)

如果我们想选取年龄大于30的用户,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.loc[df['age'] > 30])

Output:

pandas dataframe loc多条件筛选

如果我们只关心他们的名字和电子邮件,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.loc[df['age'] > 30, ['name', 'email']])

Output:

pandas dataframe loc多条件筛选

2. 多条件筛选

loc可以接受多个条件,条件之间可以用&(和)、|(或)和~(非)进行组合。注意,每个条件必须用括号括起来。

例如,如果我们想选取年龄大于30并且住在New York的用户,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.loc[(df['age'] > 30) & (df['city'] == 'New York')])

Output:

pandas dataframe loc多条件筛选

如果我们想选取年龄大于30或者住在New York的用户,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.loc[(df['age'] > 30) | (df['city'] == 'New York')])

Output:

pandas dataframe loc多条件筛选

如果我们想选取不住在New York的用户,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.loc[~(df['city'] == 'New York')])

Output:

pandas dataframe loc多条件筛选

3. 使用函数进行筛选

除了直接使用表达式进行筛选,我们还可以定义一个函数,然后把这个函数应用到每一行或每一列上。这个函数应该接受一个Series对象,然后返回一个布尔值。

例如,如果我们想选取电子邮件地址包含pandasdataframe.com的用户,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

def contains_pandasdataframe_com(email):
    return 'pandasdataframe.com' in email

print(df.loc[df['email'].apply(contains_pandasdataframe_com)])

Output:

pandas dataframe loc多条件筛选

4. 使用isin进行筛选

如果我们有一个列表,想选取列值在这个列表中的行,可以使用isin方法。

例如,如果我们想选取住在New York或Los Angeles的用户,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

cities = ['New York', 'Los Angeles']
print(df.loc[df['city'].isin(cities)])

Output:

pandas dataframe loc多条件筛选

5. 使用str进行字符串操作

如果我们想对字符串进行操作,可以使用str属性。str属性提供了很多字符串操作的方法,比如containsstartswithendswith等。

例如,如果我们想选取电子邮件地址以pandasdataframe.com结尾的用户,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.loc[df['email'].str.endswith('pandasdataframe.com')])

Output:

pandas dataframe loc多条件筛选

6. 使用query进行筛选

除了loc,Pandas还提供了query方法进行筛选。query方法可以接受一个字符串,这个字符串是一个表达式。

例如,如果我们想选取年龄大于30并且住在New York的用户,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.query("age > 30 and city == 'New York'"))

Output:

pandas dataframe loc多条件筛选

7. 使用atiat进行快速访问

如果我们只想获取或设置某个单元格的值,可以使用atiat方法。at方法接受行标签和列标签,iat方法接受行位置和列位置。

例如,如果我们想获取第一个用户的电子邮件地址,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.at[0, 'email'])

Output:

pandas dataframe loc多条件筛选

或者这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.iat[0, 3])

Output:

pandas dataframe loc多条件筛选

8. 使用iloc进行基于位置的筛选

除了loc,Pandas还提供了iloc方法进行基于位置的筛选。iloc的用法和loc类似,只是它接受的是位置而不是标签。

例如,如果我们想选取第二行和第四行,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.iloc[[1, 3]])

Output:

pandas dataframe loc多条件筛选

9. 使用mask进行筛选

mask方法可以接受一个布尔DataFrame,然后把为True的单元格替换为NaN。

例如,如果我们想把年龄小于30的单元格替换为NaN,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.mask(df['age'] < 30))

Output:

pandas dataframe loc多条件筛选

10. 使用where进行筛选

where方法和mask方法类似,只是它把为False的单元格替换为NaN。

例如,如果我们想把年龄大于30的单元格替换为NaN,可以这样做:

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'age': [25, 31, 35, 19, 45],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
    'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
}
df = pd.DataFrame(data)

print(df.where(df['age'] > 30))

Output:

pandas dataframe loc多条件筛选

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程