使用 Python Pandas 过滤行

使用 Python Pandas 过滤行

Pandas 是一个 Python 库,它提供了强大而灵活的数据结构,可以处理结构化数据。Pandas 最常用的两个数据结构是 Series(一维数据)和 DataFrame(二维数据),而且它支持对数据进行筛选,排序,切片等操作。本文将向您介绍如何使用 Pandas 过滤行,并提供相应的代码示例。

Pandas DataFrame 介绍

DataFrame 是 Pandas 库中最重要的数据结构之一,它类似一个表格,由行和列组成,在这个表格中,每行代表一个观测值,每列代表一个特征。一个 DataFrame 可以通过从各种来源读取数据(如 CSV、Excel 或数据库)或者手动创建来创建。

以下是创建一个 DataFrame 的示例:

import pandas as pd

data = {'name': ['John', 'Bob', 'Alice', 'Mary'],
        'age': [23, 54, 36, 28],
        'gender': ['M', 'M', 'F', 'F'],
        'country': ['USA', 'Canada', 'USA', 'Canada']}
df = pd.DataFrame(data)
print(df)

输出:

    name  age gender country
0   John   23      M     USA
1    Bob   54      M  Canada
2  Alice   36      F     USA
3   Mary   28      F  Canada

这个 DataFrame 包含了四个行和四个列,每列的名称是数据的一个特征,每行表示一个观测值。这个 DataFrame 包含人名、年龄、性别和国家等属性。

使用 Pandas 过滤行

通过 Pandas,我们可以在 DataFrame 中筛选出符合我们要求的行数据。Pandas 提供了 loc 和 iloc 两个属性来进行行的筛选。其中 loc 通过标签进行筛选,iloc 通过位置进行筛选。

loc 属性

loc [(label1, label2, …), :] 可以根据标签进行筛选,其中 label1, label2, … 为要筛选的标签,: 表示要选择所有列,可缺省。

以下是一个 loc 属性的示例。我们将筛选出年龄大于 30 的人:

import pandas as pd

data = {'name': ['John', 'Bob', 'Alice', 'Mary'],
        'age': [23, 54, 36, 28],
        'gender': ['M', 'M', 'F', 'F'],
        'country': ['USA', 'Canada', 'USA', 'Canada']}
df = pd.DataFrame(data)

age_filter = df.loc[df['age'] > 30, :]
print(age_filter)

输出:

    name  age gender country
1    Bob   54      M  Canada
2  Alice   36      F     USA

这个示例中,我们使用 loc 属性和布尔表达式 df[‘age’] > 30 进行筛选,即筛选出年龄大于 30 的行。注意,df.loc 的第一个参数中使用了一个布尔数组,这个布尔数组只包含 True 和 False 两种值。使用筛选条件得到的布尔数组与 DataFrame 的索引(行或列)具有相同形状。例如,我们得到了一个 shape 为 (4,) 的布尔数组:

>>> df['age'] > 30
0    False
1     True
2     True
3    False
Name: age, dtype: bool

这个布尔数组将会作为 df.loc 的第一个参数进行传递,第二个参数使用了一个冒号表示对所有列进行筛选。

iloc 属性

iloc 进行的也是行的筛选,但是它是通过位置来进行筛的。如 iloc[:, 1] 表示选择所有行的第二列。

以下是 iloc 一个示例。我们将筛选出第三行及其之后的所有数据:

“`pythonimport pandas as pd

data = {'name': ['John', 'Bob', 'Alice', 'Mary'],
'age': [23, 54, 36, 28],
'gender': ['M', 'M', 'F', 'F'],
'country': ['USA', 'Canada', 'USA', 'Canada']}
df = pd.DataFrame(data)

row_filter = df.iloc[2:, :]
print(row_filter)

<pre><code class="line-numbers">输出:

“`bash
name age gender country
2 Alice 36 F USA
3 Mary 28 F Canada

这个示例中,df.iloc 的第一个参数是[2:, :],它表示要选择从第 3 行到最后一行的所有数据,第二个参数用一个冒号表示要选择所有列。

复合筛选条件

我们还可以使用多个条件进行复合筛选。在 Pandas 中,这个操作可以用 &(and)和 |(or)操作符进行连接。例如,我们要筛选出年龄在 [30,50] 的人的信息,可以进行以下操作:

import pandas as pd

data = {'name': ['John', 'Bob', 'Alice', 'Mary'],
        'age': [23, 54, 36, 28],
        'gender': ['M', 'M', 'F', 'F'],
        'country': ['USA', 'Canada', 'USA', 'Canada']}
df = pd.DataFrame(data)

age_filter = df.loc[(df['age'] >= 30) & (df['age'] <= 50), :]
print(age_filter)

输出:

    name  age gender country
1    Bob   54      M  Canada
2  Alice   36      F     USA

在这个示例中,我们使用 & 连接了两个不同的筛选条件。其中一条是 df[‘age’] >= 30,保留年龄大于等于 30 岁的数据;另外一条是 df[‘age’] <= 50,保留年龄小于等于 50 岁的数据。注意,每个条件都要包含在括号中,以明确优先级。

数据类型转换

在 Pandas 中,我们还可以对数据列进行转换,以使数据更符合我们的需要。在进行筛选操作时,我们可能需要对数据进行类型转换,以便进行点操作。

例如,我们清洗一个数据集的时候,需要将字符串类型的日期转换为日期类型,这样方便比较日期的大小。

以下是一个例子,我们将数据集中的字符串格式的日期转换为日期类型:

import pandas as pd

data = {'name': ['John', 'Bob', 'Alice', 'Mary'],
        'date_of_birth': ['1995-03-08', '1964-05-10', '1982-09-22', '1990-12-06'],
        'gender': ['M', 'M', 'F', 'F'],
        'country': ['USA', 'Canada', 'USA', 'Canada']}
df = pd.DataFrame(data)

df['date_of_birth'] = pd.to_datetime(df['date_of_birth'])
print(df.dtypes)

输出:

name                     object
date_of_birth    datetime64[ns]
gender                   object
country                  object
dtype: object

在这个示例中,我们使用了 pd.to_datetime 函数将字符串转换为日期类型。然后,我们使用了 df.dtypes 来查看数据类型,可以看到 date_of_birth 的类型已经被转换为 datetime64。这样,在进行比较操作的时候,我们就可以直接使用日期型的比较操作符进行日期的筛选了。

综合示例

最后,让我们来看一个综合示例,将条件、选择和转换综合在一起。假设我们有一个存储学生信息的 CSV 文件,它包含了学生姓名、年龄、性别和出生日期等信息。我们想从中筛选出年龄大于等于 18 岁的男学生的姓名、年龄和出生日期,并将出生日期转换为日期类型。我们可以进行如下操作:

importpandas as pd

df = pd.read_csv('students.csv')

# 筛选条件
condition = (df['age'] >= 18) & (df['gender'] == 'M')

# 数据选择
select_columns = ['name', 'age', 'birthdate']
male_adults = df.loc[condition, select_columns]

# 数据转换
male_adults['birthdate'] = pd.to_datetime(male_adults['birthdate'])

print(male_adults)

以上代码做了以下操作:
1. 使用 pd.read_csv 从文件中读取学生信息;
2. 使用布尔序列 condition 筛选年龄大于等于 18 岁的男学生的数据;
3. 选择需要的列,即姓名、年龄和出生日期;
4. 使用 pd.to_datetime 将出生日期转换为日期类型;
5. 输出最终结果。

结论

使用 Pandas 过滤行是一个十分常见的需求。在操作 DataFrame 的过程中,我们可以使用 loc 和 iloc 属性对数据行进行筛选,同时也可以使用 & 和 | 操作符连接多个条件进行筛选。此外,我们还可以对数据进行类型转换,以满足我们的需求。通过本文的介绍,相信大家已经对 Pandas 的行操作有了更深刻的理解。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程