如何使用Numpy和Pandas基于多个列条件进行过滤和筛选的方法

如何使用Numpy和Pandas基于多个列条件进行过滤和筛选的方法

在数据分析中,根据多列条件进行过滤和筛选是一个常见的操作。Numpy和Pandas是Python中最重要的数据处理库之一,它们提供了非常强大的功能来帮助我们实现这些任务。在本文中,我们将深入探讨如何使用Numpy和Pandas基于多个列条件进行过滤和筛选的方法。

阅读更多:Numpy 教程

创建数据

在开始之前,我们需要创建一个简单的数据集。下面是一个包含姓名、年龄和性别的DataFrame:

import pandas as pd

data = {
    'Name': ['Tom', 'Jack', 'Steve', 'Ricky'],
    'Age': [28, 34, 29, 42],
    'Gender': ['Male', 'Male', 'Male', 'Female']
}

df = pd.DataFrame(data)

print(df)
Python

输出:

    Name  Age  Gender
0    Tom   28    Male
1   Jack   34    Male
2  Steve   29    Male
3  Ricky   42  Female
Python

基于一个列条件的过滤

使用Pandas,我们可以使用以下代码根据一个列条件过滤数据:

male_df = df[df['Gender'] == 'Male']

print(male_df)
Python

输出:

    Name  Age Gender
0    Tom   28   Male
1   Jack   34   Male
2  Steve   29   Male
Python

在上面的代码中,我们使用df['Gender'] == 'Male'作为条件对数据进行过滤。这会返回一个布尔型 Series,True表示满足条件。然后,我们将这个Series传递给DataFrame的索引运算符[],它会返回所有True的行。

基于多个列条件的过滤

要根据多个列条件进行过滤和筛选,只需要在条件中使用逻辑运算符 &(与)和 |(或)连接多个条件。例如,如果我们想要过滤 Gender 为 “Male” 且 Age 大于或等于 30 的行:

male_over30_df = df[(df['Gender'] == 'Male') & (df['Age'] >= 30)]

print(male_over30_df)
Python

输出:

   Name  Age Gender
1  Jack   34   Male
Python

在上面的代码中,我们使用(df['Gender'] == 'Male') & (df['Age'] >= 30)这个条件来过滤数据。该条件表达式有两个部分,第一个部分用于筛选 Gender 为 “Male” 的行,第二个部分用于筛选 Age 大于或等于 30 的行。这两个条件使用”与”运算符 “&”连接。

基于多个列条件的筛选

除了基于多个列条件进行过滤,我们还可以根据这些条件进行筛选并返回新的DataFrame。例如,如果我们希望仅返回 NameAge 列,并根据 Gender 为 “Male” 且 Age 大于或等于 30 的行进行筛选,我们可以这样做:

male_over30_df = df.loc[(df['Gender'] == 'Male') & (df['Age'] >= 30), ['Name', 'Age']]

print(male_over30_df)
Python

输出:

   Name  Age
1  Jack   34
Python

在上面的代码中,我们使用.loc[]方法筛选了 NameAge 列,并同时使用了(df['Gender'] == 'Male') & (df['Age'] >= 30)条件筛选了行。这样,我们只得到了满足条件的列和行。

基于多个列条件进行排序

除了过滤或筛选数据,我们还可以使用sort_values()方法在多个列上进行排序。例如,我们可以根据 Gender 列进行升序排序,然后在 Age 列上进行降序排序:

sorted_df = df.sort_values(by=['Gender', 'Age'], ascending=[True, False])

print(sorted_df)
Python

输出:

    Name  Age  Gender
1   Jack   34    Male
2  Steve   29    Male
0    Tom   28    Male
3  Ricky   42  Female
Python

在上面的代码中,我们使用sort_values()方法根据 Gender 列进行升序排序,然后在 Age 列上进行降序排序。by参数接受一个列名的列表,ascending参数接受一个布尔型的列表,表示每个列是否按照升序排序。在本例中,我们将Gender列设为升序,Age列设为降序。

组合多个条件

在实际的数据分析中,我们可能需要使用多个条件的组合进行复杂的筛选和过滤操作。使用Numpy和Pandas,我们可以方便地使用括号和逻辑运算符&|组合多个条件。例如,如果我们希望过滤 Gender 为 “Male” 且 Age 大于等于 30,或者 Gender 为 “Female” 且 Age 等于 42 的行:

condition1 = (df['Gender'] == 'Male') & (df['Age'] >= 30)
condition2 = (df['Gender'] == 'Female') & (df['Age'] == 42)

filtered_df = df[condition1 | condition2]

print(filtered_df)
Python

输出:

    Name  Age  Gender
1   Jack   34    Male
3  Ricky   42  Female
Python

在上面的代码中,我们使用逻辑运算符 &| 连接了两个条件表达式,使用括号将它们分组,然后将它们作为索引运算符 [] 的参数使用。

应用自定义函数

除了使用逻辑运算符和比较运算符,我们还可以使用自定义函数将多个条件组合在一起。例如,如果我们希望过滤 Name 只包含 “a” 和 “e” 两个字母的行:

def check_name(name):
    vowels = ['a', 'e']
    for vowel in vowels:
        if vowel not in name.lower():
            return False
    return True

condition = df['Name'].apply(check_name)

filtered_df = df[condition]

print(filtered_df)
Python

输出:

    Name  Age Gender
1   Jack   34   Male
3  Ricky   42   Female
Python

在上面的代码中,我们定义了一个名为check_name()的函数,该函数的参数是name,用于检查名字中是否只包含字母“a”和“e”。我们使用.apply()方法将该函数应用于 Name 列,并将其结果作为 True 或 False 值的 Series 返回。然后,我们将该Series作为条件传递给DataFrame的索引运算符 []。

总结

在本文中,我们学习了如何使用Numpy和Pandas基于多个列条件进行过滤、筛选和排序。我们了解了如何使用逻辑运算符和比较运算符,以及如何使用自定义函数来构建复杂的条件表达式。这些技术对于实际的数据分析非常有用,希望本文可以对你有所帮助。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册