蟒蛇的Pandas是一个用于数据操作和分析的强大库。其主要功能之一是能够从 Pandas DataFrame 中过滤数据。在 Pandas 中过滤数据有很多不同的方法。
它使您能够检查特定行或数据子集,按列或多列过滤 Pandas DataFrame,甚至根据条件或给定条件列表过滤 Pandas Dataframe。
在本教程中,我们将探索以下过滤 Pandas DataFrame 的方法。
进口熊猫
首先,我们需要导入 Pandas 包。这通常通过以下命令完成:
import pandas as pd
创建示例数据框
We can 创建一个简单的数据框对于本教程:
data = {
'Name': ['Alex', 'John', 'Richard', 'Tom', 'Kim', 'Lily', 'Emma', 'Jack'],
'Age': [23, 34, 30, 28, 32, 26, 29, 25],
'City': ['New York', 'London', 'London', 'Paris', 'Berlin', 'Berlin', 'London', 'New York'],
'Gender': ['M', 'M', 'M', 'M', 'F', 'F', 'F', 'M']
}
df = pd.DataFrame(data)
# Display the first five rows of the dataframe
print(df.head())
这将返回以下输出:
Name Age City Gender
0 Alex 23 New York M
1 John 34 London M
2 Richard 30 London M
3 Tom 28 Paris M
4 Kim 32 Berlin F
在上面的代码中,我们从 Python 字典创建了一个 DataFrame,并使用 head 方法仅打印前五行。
根据单列值过滤行
您可以根据列中的特定值过滤 Pandas DataFrame 行。例如,要过滤“Gender”为“M”的行:
df_filtered = df[df['Gender'] == 'M']
print(df_filtered)
这将返回:
Name Age City Gender
0 Alex 23 New York M
1 John 34 London M
2 Richard 30 London M
3 Tom 28 Paris M
7 Jack 25 New York M
使用多个列值过滤行
要根据多个列值过滤行,您可以使用多个条件:
df_filtered = df[(df['Gender'] == 'M') & (df['Age'] > 30)]
print(df_filtered)
结果将是:
Name Age City Gender
1 John 34 London M
在这里,我们过滤 DataFrame 并仅返回 Gender =“M”且年龄大于 30 的行。
使用逻辑运算符(AND、OR、NOT)过滤行
Pandas 允许使用逻辑运算符(& 表示 AND,| 表示 OR,~ 表示 NOT)来过滤 DataFrame。在这里,我们过滤“性别”为“M”或“城市”为“纽约”的行:
df_filtered = df[(df['Gender'] == 'M') | (df['City'] == 'New York')]
print(df_filtered)
这将返回:
Name Age City Gender
0 Alex 23 New York M
1 John 34 London M
2 Richard 30 London M
3 Tom 28 Paris M
7 Jack 25 New York M
根据空值或缺失值过滤行
您可以根据空值或缺失值过滤 DataFrame 行。在 Pandas 中,NaN(非数字)用于表示缺失值。您可以使用isnull
过滤包含缺失值的行的函数:
df_filtered = df['Age'].isnull()
print(df_filtered)
这将返回一个系列,其中包含缺失值的行为“True”,没有缺失值的行为“False”:
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
Name: Age, dtype: bool
使用 isin 方法过滤行
The isin
方法用于根据值列表过滤行。它返回一个为 True 的布尔系列,其中列值位于给定列表中,并使用此布尔系列来选择仅具有 True 的行:
df_filtered = df[df['City'].isin(['London', 'Berlin'])]
print(df_filtered)
这将为我们提供:
Name Age City Gender
1 John 34 London M
2 Richard 30 London M
4 Kim 32 Berlin F
5 Lily 26 Berlin F
6 Emma 29 London F
基于正则表达式 (Regex) 过滤行
Pandas 允许使用正则表达式过滤 DataFrame 行。这str.contains
通过将 regex 参数设置为 True,函数可以与正则表达式模式一起使用:
df_filtered = df[df['Name'].str.contains('^A', regex=True)]
print(df_filtered)
这是生成的数据框:
Name Age City Gender
0 Alex 23 New York M
使用 loc 函数过滤行
The loc
函数用于根据列的标签过滤行。它还可以接受布尔数据,允许它与逻辑运算符一起使用:
df_filtered = df.loc[df['Age'] > 30]
print(df_filtered)
这导致:
Name Age City Gender
1 John 34 London M
4 Kim 32 Berlin F
这里我们只返回年龄大于 30 的行。
使用 iloc 函数过滤行
The iloc
函数用于根据位置过滤行:
df_filtered = df.iloc[0:5]
print(df_filtered)
这将返回 DataFrame 的前五行:
Name Age City Gender
0 Alex 23 New York M
1 John 34 London M
2 Richard 30 London M
3 Tom 28 Paris M
4 Kim 32 Berlin F
上面的代码返回位置在 0 到 5 之间的行。 iloc 从零开始,因此它从位置零开始计数。
使用波形符 (~) 运算符过滤行
波形符 (~) 运算符用于过滤不符合条件的行:
df_filtered = df[~(df['City'] == 'New York')]
print(df_filtered)
生成的 DataFrame 将是:
Name Age City Gender
1 John 34 London M
2 Richard 30 London M
3 Tom 28 Paris M
4 Kim 32 Berlin F
5 Lily 26 Berlin F
6 Emma 29 London F
这里的代码仅返回 City 不是“New York”的行。
使用关系运算符(、=、==)
您还可以使用关系运算符过滤行:
df_filtered = df[df['Age'] > 30]
print(df_filtered)
这将返回:
Name Age City Gender
1 John 34 London M
4 Kim 32 Berlin F
正如您所看到的,它返回年龄大于 30 的行。
根据值范围过滤行
要过滤特定值范围内的行:
df_filtered = df[(df['Age'] >= 25) & (df['Age'] <= 30)]
df_filtered
这将导致:
Name Age City Gender
2 Richard 30 London M
3 Tom 28 Paris M
5 Lily 26 Berlin F
6 Emma 29 London F
7 Jack 25 New York M
上面的代码返回年龄大于或等于 25 且小于或等于 30 的行。
根据索引标签过滤行
Pandas DataFrame 有一个Index
对象,它允许我们使用索引标签快速选择行loc
功能:
df_filtered = df.loc[[0, 2, 4]]
print(df_filtered)
这将为我们提供:
Name Age City Gender
0 Alex 23 New York M
2 Richard 30 London M
4 Kim 32 Berlin F
如您所见,我们选择了索引为 0、2、4 的行。
使用自定义函数过滤行
您还可以使用自定义函数来过滤行:
def filter_func(row):
return row['Name'].startswith('A')
df_filtered = df[df.apply(filter_func, axis=1)]
print(df_filtered)
这将返回:
Name Age City Gender
0 Alex 23 New York M
在这里,我们定义了一个函数并过滤了名称以字母“A”开头的行。
使用列名称过滤列
您可以使用列名称过滤列:
df_filtered = df[['Name', 'Age']]
print(df_filtered)
输出将是:
Name Age
0 Alex 23
1 John 34
2 Richard 30
3 Tom 28
4 Kim 32
5 Lily 26
6 Emma 29
7 Jack 25
正如您所看到的,我们只返回两列“Name”和“Age”。
使用正则表达式 (Regex) 过滤列
您可以使用正则表达式来过滤列:
df_filtered = df.filter(regex='^N')
print(df_filtered)
这将返回:
Name
0 Alex
1 John
2 Richard
3 Tom
4 Kim
5 Lily
6 Emma
7 Jack
上面的代码过滤列名以字母“N”开头的列。
按行和列过滤数据
您可以使用以下命令过滤行和列loc
功能:
df.loc[df['Age'] > 30, ['Name', 'City']]
这将返回:
Name City
1 John London
4 Kim Berlin
上面的代码仅返回年龄大于 30 岁的行,并且仅获取“姓名”和“城市”。
根据特定条件过滤行和列
您可以使用特定条件来过滤行和列:
df_filtered = df.loc[df['Age'] > 30, df.columns.str.startswith('N')]
print(df_filtered)
这将返回:
Name
1 John
4 Kim
这里我们有一个混合条件,返回 Age 大于 30 的行,并且只获取 Name 列。
按两列中的条件过滤 DataFrame 行
您可以根据两列中的条件过滤 DataFrame 行:
df_filtered = df[(df['Age'] > 30) & (df['City'] == 'London')]
print(df_filtered)
这将返回:
Name Age City Gender
1 John 34 London M
这里两个条件都属于列。我们得到年龄大于 30 且城市=“伦敦”的行。
使用查询方法过滤 DataFrame 行
您可以使用query
方法通过将条件作为字符串传递来过滤 DataFrame 行,如下所示:
df_filtered = df.query("Age > 30 and City == 'London'")
print(df_filtered)
这将返回:
Name Age City Gender
1 John 34 London M
过滤 Pandas DataFrame 救了我
我有无数的故事,讲述了 Python(特别是 Pandas 包)的强大功能如何极大地减少了数据操作任务所需的时间和精力。
但有一个故事很引人注目。这个故事讲述的是我当时正在从事一个巨大的自由项目,该项目需要筛选大量数据集并执行复杂的数据过滤。
该项目涉及分析包含国际电子商务公司历史销售数据的数据集。
该数据集包含超过 1000 万行,其中数十列代表各种数据点,例如产品 ID、客户 ID、销售区域、产品类别、销售日期等。目标是执行有针对性的销售分析,这需要根据多个条件提取特定的数据子集。
想象一下手动浏览数百万条记录并尝试提取特定子集。这将是一场噩梦!这就是 Pandas DataFrame 过滤可以发挥作用的地方。
该项目的一部分需要识别来自特定地区(例如“北美”)的客户,这些客户在“电子”类别中购买的商品金额超过一定金额(例如 500 美元)。
借助 Pandas DataFrame 过滤的强大功能,我只需一行代码即可完成此操作:
df_filtered = df[(df['Region'] == 'North America') & (df['Purchase Amount'] > 500) & (df['Category'] == 'Electronics')]
该行过滤掉了大约 50,000 笔符合指定条件的交易——仅占整个数据集的 0.5%,但对于目标分析来说非常有价值。
该项目的另一个关键部分涉及时间序列分析。我需要分析每个产品类别的每月销售趋势。问题在于“销售日期”列采用字符串格式,并且包含日期和时间,这对于此分析来说是不必要的。
以下是我用 Pandas 解决这个问题的方法:
df['Sale Date'] = pd.to_datetime(df['Sale Date']).dt.to_period('M')
然后,过滤特定月份的数据:
df_filtered = df[df['Sale Date'] == '2023-01']
在另一个例子中,我被要求根据总购买金额关注前 1% 的客户。感谢 Pandas,这看起来就像小孩子的游戏:
top_customers = df.groupby('Customer ID')['Purchase Amount'].sum().nlargest(int(0.01*df['Customer ID'].nunique()))
每个过滤操作只需要几秒钟即可运行。
结论
本教程介绍了过滤 Pandas DataFrame 中数据的各种方法。过滤数据是数据分析和准备的关键步骤,Pandas 为这项任务提供了强大而灵活的工具包。