Python中的Pandas filter()方法

99 阅读8分钟

Pandas DataFrame filter()方法

在本教程中,我们将看一下潘达斯的filter() 方法。我们将看到这个函数的作用,以及我们如何将其应用于我们的数据框架。顾名思义,filter() 方法可以过滤我们的数据框架。更具体地说,该方法根据所述的索引指定,对我们的数据框架的行或列进行子集。

Pandas DataFrame filter() Documentation

按特定项目过滤

为了了解该方法是如何工作的,让我们看一下一个介绍性的例子。

import pandas as pd

data = {
    'height': [1.68, 1.86, 2.01, 1.74],
    'children': [1, 3, 0, 2],
    'pets': [2, 3, 1, 0]
}

df = pd.DataFrame(data, index=['Josh', 'Angela', 'Tom', 'Mary'])
df
高度儿童宠物
乔什1.6812
安吉拉1.8633
冯小刚2.0101
冯小刚1.7420

首先,我们导入我们需要的库。在本例中,只有Pandas。然后我们将样本数据集创建为一个列表的字典 。这些数据包含一个人的身高、孩子的数量和宠物的数量。接下来,我们使用数据集创建一个Pandas数据框架 ,并应用每个人的名字作为数据框架的索引。最后,我们输出这个数据框架。

现在,如果我们只想看到每个人的身高和孩子的数量,我们会怎么做?我们将不得不过滤掉 "宠物 "列。这就是Pandas的filter() 方法发挥作用的地方。

df.filter(['height', 'children'])
身高子女
乔什1.681
安吉拉1.863
汤姆2.010
玛丽1.742

因此,在过滤函数的括号内,我们传递了一个我们想要过滤数据框架的项目列表。在这种情况下,我们选择 "高度 "和 "儿童 "列,因此输出只显示只有这两列的数据框。这样我们就过滤掉了 "pets "列。

另一种通过 "高度 "和 "子女 "列过滤的方式是这样的。

df.filter(items=['height', 'children'])
高度儿童
乔希1.681
安吉拉1.863
汤姆2.010
玛丽1.742

正如你所看到的,输出结果与之前一样。我们得到了过滤掉 "pets "列的数据框架。唯一不同的是,我们将这些列分配给filter() 函数的 "items" 参数。

按行或列过滤

到现在为止,我们已经看到了如何通过将列分配给 "items" 参数来过滤我们的数据框架。但是如果我们想通过行来过滤数据框呢?为了实现这一点,我们使用 "axis" 参数。让我们再看一下之前的数据框架。

高度儿童宠物
乔希1.6812
安吉拉1.8633
冯小刚2.0101
冯小刚1.7420

如果我们只想看到安吉拉和汤姆的身高、子女和宠物,代码是这样的。

df.filter(items=['Angela', 'Tom'], axis=0)
身高子女宠物
安吉拉1.8633
汤姆2.0101

如前所述,我们把要过滤的项目作为一个列表分配给 "items" 参数。此外,我们确定要过滤的轴。我们给 "axis" 参数赋值为 "0"。 "0 "意味着我们要按行过滤数据框架。同样,我们可以写 "index" 而不是 " 0" ,得到同样的输出。

df.filter(items=['Angela', 'Tom'], axis='index')
高度儿童宠物
安吉拉1.8633
汤姆2.0101

如果我们将1应用于"axis"参数,我们将按列过滤数据框架。

df.filter(items=['height', 'children'], axis=1)
高度儿童
乔什1.681
安吉拉1.863
汤姆2.010
玛丽1.742

我们也可以将字符串"columns" ,而不是1,应用于轴参数。

df.filter(items=['height', 'children'], axis='columns')
高度儿童
乔什1.681
安吉拉1.863
汤姆2.010
玛丽1.742

我们注意到,输出的数据框架与顶部的数据框架是一样的,在这里我们根本没有指定"axis" 参数。这是因为,默认情况下,如果我们不给"axis"参数分配任何其他东西,Pandasfilter() 方法会按列过滤 数据框架。

然而,如果我们想按行过滤,而不确定 "axis "参数,我们会得到一个无用的输出。

df.filter(items=['Angela', 'Tom'])
乔希
安吉拉
汤姆
玛丽

因此,如果我们按行过滤,我们必须给 "axis" 参数赋值 "0 "或"index" ,而如果我们按列过滤,则不一定需要 "axis" 参数。

应用 "喜欢 "参数

到目前为止,我们已经看到了如何通过列或行名来过滤我们的数据。但是,我们也可以不通过整个项目名称来过滤,而是用特定的字母来过滤项目。例如,我们可能想只显示包含字母 "a "的行。这就是我们利用filter() 方法的 "like "参数的地方。

df.filter(like="a", axis=0)
高度儿童宠物
安吉拉1.8633
玛丽1.7420

我们将字符串"a" 赋给 "like" 参数,并说我们想通过将值 "0 "应用于 "轴 "参数来过滤行数据。输出显示了一个新的数据框架,其中的行项至少包含一个"a" 。无论如何,我们并不局限于在这里只使用一个字符。"like" 参数也允许我们输入多个字符。

df.filter(like="om", axis=0)
高度儿童宠物
汤姆2.0101

输出结果再次显示了一个数据框架。这一次,它只显示索引 "Tom",因为它是唯一包含字符串 "om "的行。

与此类似,我们能够使用 "like "参数来过滤列。我们只需要给 "轴 "参数赋值 "1",告诉程序我们要按列而不是按行过滤。

df.filter(like="pe", axis=1)
宠物
乔希2
安吉拉3
汤姆1
玛丽0

输出结果显示数据框架中只有 "pets "列,因为它是唯一包含字符串"pe" 的列。

使用正则表达式进行过滤

将"like"参数应用于filter() 方法允许我们通过项目中包含的字符串过滤数据。然而,我们可能想进一步指定过滤,例如,过滤掉以字母 "a "结尾的行。"like" 参数在这里不起作用,因为如果我们将"a" 应用于 "like" 参数,程序就会寻找项目中任何含有字母"a" 的项目。

df.filter(like="a", axis=0)
高度儿童宠物
安吉拉1.8633
玛丽1.7420

正如我们所看到的,输出的数据框架显示了 "Angela "和 "Mary",因为两者都有一个 "a "在里面。

为了得到以字母 "a "结尾的项目,我们使用正则表达式。正则表达式是用来确定一个字符串是否包含一个特定的搜索模式。幸运的是,filter() 方法为我们提供了一个可选的参数 "regex"。这样,我们就可以使用正则表达式来过滤我们的数据。

df.filter(regex='a$', axis=0)
高度孩子宠物
安吉拉1.8633

我们将"a$" 应用于 "regex" 参数,并将 "axis" 参数赋值为 "0"。这意味着我们按行过滤数据框架,寻找任何以字符 "a "结尾的项目。与之前将字符 "a "应用于 "like "参数的例子相反,我们只得到 "Angela "作为输出,而不是 "Angela "和 "Mary",因为 "Angela "是唯一以 "a "结尾的项目。

同样,我们能够使用正则表达式来查看哪些项目包含指定字符集的字符(例如:[a,b,c])。

df.filter(regex='[a,b,c]', axis=1)
儿童
乔希1
安吉拉3
汤姆0
玛丽2

在这里,我们要寻找所有至少包含 列表中一个字母的列[a,b,c] 。由于 "children "列是唯一包含该列表中至少一个字符(字母 "c")的列,所以它是唯一输出的列。

有成千上万种方法可以使用正则表达式与filter() 方法相结合。到目前为止我们只看到了几种,但是如果你还没有,强烈建议你学习一下正则表达式,因为它们的使用非常强大,不仅是在使用filter() 方法时,而且在其他场合也是如此。

filter()函数的替代方法

为了过滤我们的数据,我们不一定需要应用filter() 函数。有几种方法可以对我们的数据帧进行过滤操作。一种替代方法是根本不使用任何具体的操作,而只是使用方括号内的列名列表。

df[["height", "children"]]
高度儿童
乔什1.681
安吉拉1.863
汤姆2.010
玛丽1.742

输出结果与我们使用之前的这种方法完全相同。

df.filter(items=['height', 'children'], axis=1)
高度儿童
乔什1.681
安吉拉1.863
汤姆2.010
玛丽1.742

然而,过滤行的另一种方法是使用loc()操作。

df.loc[["Josh", "Angela"]]
高度儿童宠物
乔什1.6812
安吉拉1.8633

在这里,我们只显示 "Josh "和 "Angela "行,将这些项目作为一个列表应用到loc() 。之前的方法,使用filter() 方法,看起来像这样。

df.filter(items=["Josh", "Angela"], axis=0)
高度儿童宠物
乔希1.6812
安吉拉1.8633

正如我们所看到的,除了filter() 方法之外,还有几种选择来过滤我们的数据框。然而,我们在这里看到的方法只是其中的几种。还有更多的方法,但如果在这里全部展示,就有点太多。

总结

总而言之,filter() 方法是一个非常有用的工具,它很容易使用。它允许我们以许多不同的方式对数据框架的行或列进行子集。我们可以用 "items"参数按整个项目过滤我们的数据框架,用 "like"参数按几个字符过滤,甚至可以应用正则表达式,过滤的机会几乎是无限的。