过滤Pandas数据帧的14种方法

398 阅读4分钟

每当我们处理任何类型的数据时,我们都需要对我们所处理的数据类型有一个清晰的认识。对于外面的大多数数据,可能包含数千甚至数百万的条目,其中有各种各样的信息,如果没有任何工具将数据以简短和可读的格式呈现出来,就真的不可能对这些数据产生意义。

大多数时候,我们需要通过数据,对其进行操作,并将其可视化以获得洞察力。那么,有一个伟大的库,它的名字叫Pandas,为我们提供了这种能力。最常见的数据处理操作是数据过滤。它非常类似于SQL中的WHERE子句,或者你一定使用过MS Excel中的过滤器来根据某些条件选择特定的行。

**pandas是一个强大的、灵活的、开源的数据分析/处理工具,本质上是一个Python包,它提供了速度、灵活性和富有表现力的数据结构,以直观和简单的方式处理 "关系型"或 "标记型"数据。它是 在Python中进行现实世界数据分析的最流行的库之一

pandas建立在NumPy之上 ,旨在与科学计算环境和许多其他第三方库很好地整合。它有两个主要的数据结构,即系列(1D)数据帧(2D),在大多数现实世界的使用案例中,这是金融、科学计算、工程和统计等许多领域正在处理的数据类型。

让我们在Pandas数据框架的帮助下开始过滤数据吧

安装pandas

导入Pandas库,读取我们的样本数据文件并将其分配给 "df", 数据框架

import pandas as pd
df = pd.read_csv(r"C:\Users\rajam\Desktop\sample_data.csv")

让我们来看看我们的数据框架

Sample_data

现在我们有了我们的DataFrame,我们将应用各种方法来过滤它。

方法-1:通过列值过滤DataFrame

我们的DataFrame中有一个名为 "Total_Sales "的列,我们想过滤掉所有大于300的销售值。

#Filter a DataFrame for a single column value with a given condition

greater_than = df[df['Total_Sales'] > 300]
print(greater_than.head())

大于300的销售额

方法-2:基于多个条件过滤数据框架

在这里,我们要过滤所有 "Total_Sales "值大于300和 "Units "值大于20的值。我们必须使用Python操作符"&",它可以执行位和操作,以显示相应的结果。

#Filter a DataFrame with multiple conditions

filter_sales_units = df[(df['Total_Sales'] > 300) & (df["Units"] > 20)]
print(Filter_sales_units.head())

对销售额和单位进行过滤

方法-3:基于日期值过滤数据框

如果我们想根据某个日期值来过滤我们的数据框,例如,在这里我们想得到基于某个特定日期的所有结果,在我们的例子中,是在日期 "03/10/21 "之后的结果。

#Filter a DataFrame based on specific date

date_filter = df[df['Date'] > '03/10/21']
print(date_filter.head())

按日期过滤

方法-4 :基于日期值的多条件过滤数据框

在这里,我们得到了我们的日期操作评估多个日期的所有结果。

#Filter a DataFrame with multiple conditions our Date value

date_filter2 = df[(df['Date'] >= '3/25/2021') & (df['Date'] <'8/17/2021')]
print(date_filter2.head())

用多个条件过滤一个日期

方法-5 :基于特定字符串过滤数据框架

在这里,我们选择一个名为 "区域 "的列,获得所有来自 "东部 "地区的行,从而基于一个特定的字符串值进行过滤。

#Filter a DataFrame to a specific string

east = df[df['Region'] == 'East']
print(east.head())

基于特定字符串的过滤

方法-6 :基于字符串中的特定索引值过滤DataFrame

在这里,我们选择一个叫做'Region'的列,并获得所有以字母'E'为第一个字符的记录,即在指定的列结果中索引为0

#Filter a DataFrame to show rows starting with a specfic letter

starting_with_e = df[df['Region'].str[0]== 'E']
print(starting_with_e.head())

基于一个特定字母的过滤

方法-7 :基于值的列表过滤数据框架

在这里,我们要过滤包含 "西 "和 "东 "两个值的 "区域 "列中的行,并显示综合结果。有两种方法可以用来执行这种过滤,即使用管道|运算符,用下面的语法输入相应的所需值集,或者我们可以使用**.isin()**函数来过滤给定列中的值,在我们的例子中是'Region',并以列表形式提供里面所需的值集。

#Filter a DataFrame rows based on list of values

#Method 1:
east_west = df[(df['Region'] == 'West') | (df['Region'] == 'East')]
print(east_west)

#Method 2:
east_west_1 = df[df['Region'].isin(['West', 'East'])]
print(east_west_1.head())

方法-2的输出

方法-8 :使用RegEx根据特定值过滤DataFrame行

在这里,我们希望在'Region'列中的所有值**,在其字符串值中以'th'结尾**,并显示它们。换句话说,我们希望我们的结果显示''和''的值,而*忽略'东'和'西'。*方法.**str.contains()与指定的值以及$**RegEx模式一起使用,可以得到所需的结果。

#Filtering the DataFrame rows using regular expressions(REGEX)

regex_df = df[df['Region'].str.contains('th$')]
print(regex_df.head())

基于REGEX的过滤

方法 - 9 :过滤数据框架以检查空值

在这里,我们将在isnull()函数的帮助下检查所有列的空值和非空值。

#Filtering to check for null and not null values in all columns

df_null = df[df.isnull().any(axis=1)]
print(df_null.head())

基于NULL或NOT NULL值的过滤

方法 - 10:过滤数据框架,检查特定列中的空值

#Filtering to check for null values if any in the 'Units' column

units_df = df[df['Units'].isnull()]
print(units_df.head())

寻找特定列的空值

方法 - 11: 过滤DataFrame以检查特定列中的 空值

#Filtering to check for not null values in the 'Units' column

df_not_null = df[df['Units'].notnull()]
print(df_not_null.head())

寻找特定列上的非空值

方法 - 12:使用条件过滤DataFrame **query()**条件过滤数据帧

#Using query function in pandas

df_query = df.query('Total_Sales > 300')
print(df_query.head())

Query 函数过滤数值

方法 - 13:使用多个条件过滤数据框架 **query()**用多个条件过滤数据框

#Using query function with multiple conditions in pandas

df_query_1 = df.query('Total_Sales > 300 and Units <18')
print(df_query_1.head())

Query 函数过滤多列

方法 - 14:使用条件过滤我们的DataFrame。 **loc**和 **iloc**函数过滤我们的数据框架。

#Creating a sample DataFrame for illustrations

import numpy as np
data = pd.DataFrame({"col1" : np.arange(1, 20 ,2)}, index=[19, 18 ,8, 6, 0, 1, 2, 3, 4, 5])
print(data)

解释。 **iloc**根据给定索引的位置考虑行,所以它只取整数作为值。

更多信息请查看Pandas文档

#Filter with iloc

data.iloc[0 : 5]

解释loc ,根据索引标签考虑行数。

#Filter with loc

data.loc[0 : 5]

使用过滤器loc

你可能会想,为什么**loc** 函数返回6行而不是5行。这是因为 ***loc***不产生基于索引位置的输出。它只考虑索引的标签,也可以是一个字母,包括起点和终点。

总结

所以,这些是pandas中最常用的一些过滤方法。还有很多其他的过滤方法可以使用,但这些是最常见的一些。在选择过滤方法时,重要的是要考虑你要过滤的数据,数据的类型,以及你要做的过滤的类型。希望你喜欢这篇文章。想了解更多,别忘了阅读Pandas教程