pandas dataframe 根据列值进行过滤
参考:pandas dataframe filter by column value
在数据分析过程中,我们经常需要根据某些条件来过滤数据,以便对特定的数据子集进行进一步的分析和处理。在pandas库中,我们可以使用多种方法来实现这一目标。本文将详细介绍如何使用pandas dataframe根据列值进行过滤。
1. 使用布尔索引进行过滤
布尔索引是一种非常强大的数据过滤方式。它允许我们根据一系列布尔值(True或False)来选择数据。在pandas中,我们可以使用布尔索引来过滤dataframe。
示例代码1:
import pandas as pd
# 创建一个dataframe
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 31, 35, 19, 45],
'city': ['New York', 'Los Angeles', 'London', 'Shanghai', 'Sydney']
})
# 过滤出年龄大于30的人
df_filtered = df[df['age'] > 30]
print(df_filtered)
Output:
在上面的示例中,df['age'] > 30
会返回一个布尔序列,其中年龄大于30的行为True,其余为False。然后,我们可以使用这个布尔序列来过滤dataframe。
2. 使用query
方法进行过滤
除了使用布尔索引,我们还可以使用query
方法来过滤dataframe。query
方法允许我们使用字符串表达式来定义过滤条件。
示例代码2:
import pandas as pd
# 创建一个dataframe
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 31, 35, 19, 45],
'city': ['New York', 'Los Angeles', 'London', 'Shanghai', 'Sydney']
})
# 过滤出年龄大于30的人
df_filtered = df.query('age > 30')
print(df_filtered)
Output:
在上面的示例中,我们使用字符串'age > 30'
来定义过滤条件。query
方法会自动解析这个字符串,并返回满足条件的行。
3. 使用loc
和iloc
进行过滤
loc
和iloc
是pandas中的两个重要的索引器,它们可以用来选择dataframe的特定行和列。我们可以结合布尔索引,使用loc
和iloc
来过滤dataframe。
示例代码3:
import pandas as pd
# 创建一个dataframe
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 31, 35, 19, 45],
'city': ['New York', 'Los Angeles', 'London', 'Shanghai', 'Sydney']
})
# 过滤出年龄大于30的人
df_filtered = df.loc[df['age'] > 30]
print(df_filtered)
Output:
在上面的示例中,我们使用loc
和布尔索引来过滤dataframe。loc
会返回所有满足布尔索引条件的行。
4. 使用isin
方法进行过滤
isin
方法可以用来检查dataframe的某一列是否包含在给定的值列表中。我们可以使用isin
方法来过滤dataframe。
示例代码4:
import pandas as pd
# 创建一个dataframe
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 31, 35, 19, 45],
'city': ['New York', 'Los Angeles', 'London', 'Shanghai', 'Sydney']
})
# 过滤出居住在New York和London的人
cities = ['New York', 'London']
df_filtered = df[df['city'].isin(cities)]
print(df_filtered)
Output:
在上面的示例中,我们创建了一个包含’New York’和’London’的列表,然后使用isin
方法来过滤dataframe。
5. 使用str
方法进行过滤
在处理字符串列时,我们可以使用str
方法来进行过滤。str
方法提供了一系列字符串处理函数,如contains
、startswith
、endswith
等。
示例代码5:
import pandas as pd
# 创建一个dataframe
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 31, 35, 19, 45],
'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
})
# 过滤出邮箱以'pandasdataframe.com'结尾的人
df_filtered = df[df['email'].str.endswith('pandasdataframe.com')]
print(df_filtered)
Output:
在上面的示例中,我们使用str.endswith
方法来过滤dataframe。这个方法会返回一个布尔序列,其中邮箱以’pandasdataframe.com’结尾的行为True,其余为False。
6. 使用多个条件进行过滤
在实际应用中,我们经常需要根据多个条件来过滤dataframe。在pandas中,我们可以使用&
(和)、|
(或)和~
(非)操作符来组合多个条件。
示例代码6:
import pandas as pd
# 创建一个dataframe
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 31, 35, 19, 45],
'city': ['New York', 'Los Angeles', 'London', 'Shanghai', 'Sydney']
})
# 过滤出年龄大于30并且居住在London的人
df_filtered = df[(df['age'] > 30) & (df['city'] == 'London')]
print(df_filtered)
Output:
在上面的示例中,我们使用&
操作符来组合两个条件:’age > 30’和’city London’。
7. 使用between
方法进行过滤
between
方法可以用来检查dataframe的某一列的值是否在给定的范围内。我们可以使用between
方法来过滤dataframe。
示例代码7:
import pandas as pd
# 创建一个dataframe
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 31, 35, 19, 45],
'city': ['New York', 'Los Angeles', 'London', 'Shanghai', 'Sydney']
})
# 过滤出年龄在30到40之间的人
df_filtered = df[df['age'].between(30, 40)]
print(df_filtered)
Output:
在上面的示例中,我们使用between
方法来过滤dataframe。这个方法会返回一个布尔序列,其中年龄在30到40之间的行为True,其余为False。
8. 使用filter
方法进行过滤
filter
方法可以用来选择dataframe的列。虽然它通常用于选择列,但我们也可以通过一些技巧来实现基于值的过滤。
示例代码8:
import pandas as pd
# 创建一个dataframe
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 31, 35, 19, 45],
'email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com', 'eve@pandasdataframe.com']
})
# 过滤出包含'email'列的dataframe,并且'email'列的值包含'pandasdataframe.com'
df_filtered = df.loc[df['email'].str.contains('pandasdataframe.com'), df.filter(like='email').columns]
print(df_filtered)
Output:
在上面的示例中,我们首先使用str.contains
方法来创建一个布尔索引,然后使用filter
方法来选择包含’email’的列。
9. 使用drop
方法删除不需要的行
有时候,过滤数据不仅仅是选择满足条件的行,也可能涉及到删除不满足条件的行。drop
方法可以用来删除dataframe中的行或列。
示例代码9:
import pandas as pd
# 创建一个dataframe
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 31, 35, 19, 45],
'city': ['New York', 'Los Angeles', 'London', 'Shanghai', 'Sydney']
})
# 删除年龄小于30的行
df_filtered = df.drop(df[df['age'] < 30].index)
print(df_filtered)
Output:
在上面的示例中,我们首先找到年龄小于30的行的索引,然后使用drop
方法来删除这些行。
10. 使用select_dtypes
方法进行过滤
在处理包含多种数据类型的dataframe时,我们可能只对某些特定数据类型的列感兴趣。select_dtypes
方法可以用来选择dataframe中特定数据类型的列。
示例代码10:
import pandas as pd
# 创建一个dataframe
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 31, 35, 19, 45],
'salary': [50000, 60000, 70000, 40000, 80000]
})
# 选择数值类型的列
df_filtered = df.select_dtypes(include=[int, float])
print(df_filtered)
Output:
在上面的示例中,我们使用select_dtypes
方法来选择dataframe中的数值类型列。
结论
在本文中,我们详细介绍了使用pandas dataframe根据列值进行过滤的多种方法。这些方法包括使用布尔索引、query
方法、loc
和iloc
索引器、isin
方法、str
方法、多条件过滤、between
方法、filter
方法、drop
方法和select_dtypes
方法。通过这些方法,我们可以灵活地选择和过滤数据,以满足不同的数据分析需求。