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:
如果我们只关心他们的名字和电子邮件,可以这样做:
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:
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:
如果我们想选取年龄大于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:
如果我们想选取不住在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:
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:
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:
5. 使用str
进行字符串操作
如果我们想对字符串进行操作,可以使用str
属性。str
属性提供了很多字符串操作的方法,比如contains
、startswith
、endswith
等。
例如,如果我们想选取电子邮件地址以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:
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:
7. 使用at
和iat
进行快速访问
如果我们只想获取或设置某个单元格的值,可以使用at
和iat
方法。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:
或者这样做:
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:
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:
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:
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: