Pandas DataFrame filter()方法
在本教程中,我们将看一下潘达斯的filter()
方法。我们将看到这个函数的作用,以及我们如何将其应用于我们的数据框架。顾名思义,filter()
方法可以过滤我们的数据框架。更具体地说,该方法根据所述的索引指定,对我们的数据框架的行或列进行子集。
按特定项目过滤
为了了解该方法是如何工作的,让我们看一下一个介绍性的例子。
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.68 | 1 | 2 |
安吉拉 | 1.86 | 3 | 3 |
冯小刚 | 2.01 | 0 | 1 |
冯小刚 | 1.74 | 2 | 0 |
首先,我们导入我们需要的库。在本例中,只有Pandas。然后我们将样本数据集创建为一个列表的字典 。这些数据包含一个人的身高、孩子的数量和宠物的数量。接下来,我们使用数据集创建一个Pandas数据框架 ,并应用每个人的名字作为数据框架的索引。最后,我们输出这个数据框架。
现在,如果我们只想看到每个人的身高和孩子的数量,我们会怎么做?我们将不得不过滤掉 "宠物 "列。这就是Pandas的filter()
方法发挥作用的地方。
df.filter(['height', 'children'])
身高 | 子女 | |
乔什 | 1.68 | 1 |
安吉拉 | 1.86 | 3 |
汤姆 | 2.01 | 0 |
玛丽 | 1.74 | 2 |
因此,在过滤函数的括号内,我们传递了一个我们想要过滤数据框架的项目列表。在这种情况下,我们选择 "高度 "和 "儿童 "列,因此输出只显示只有这两列的数据框。这样我们就过滤掉了 "pets "列。
另一种通过 "高度 "和 "子女 "列过滤的方式是这样的。
df.filter(items=['height', 'children'])
高度 | 儿童 | |
乔希 | 1.68 | 1 |
安吉拉 | 1.86 | 3 |
汤姆 | 2.01 | 0 |
玛丽 | 1.74 | 2 |
正如你所看到的,输出结果与之前一样。我们得到了过滤掉 "pets "列的数据框架。唯一不同的是,我们将这些列分配给filter()
函数的 "items
" 参数。
按行或列过滤
到现在为止,我们已经看到了如何通过将列分配给 "items
" 参数来过滤我们的数据框架。但是如果我们想通过行来过滤数据框呢?为了实现这一点,我们使用 "axis
" 参数。让我们再看一下之前的数据框架。
高度 | 儿童 | 宠物 | |
乔希 | 1.68 | 1 | 2 |
安吉拉 | 1.86 | 3 | 3 |
冯小刚 | 2.01 | 0 | 1 |
冯小刚 | 1.74 | 2 | 0 |
如果我们只想看到安吉拉和汤姆的身高、子女和宠物,代码是这样的。
df.filter(items=['Angela', 'Tom'], axis=0)
身高 | 子女 | 宠物 | |
安吉拉 | 1.86 | 3 | 3 |
汤姆 | 2.01 | 0 | 1 |
如前所述,我们把要过滤的项目作为一个列表分配给 "items
" 参数。此外,我们确定要过滤的轴。我们给 "axis
" 参数赋值为 "0"。 "0 "意味着我们要按行过滤数据框架。同样,我们可以写 "index
" 而不是 " 0" ,得到同样的输出。
df.filter(items=['Angela', 'Tom'], axis='index')
高度 | 儿童 | 宠物 | |
安吉拉 | 1.86 | 3 | 3 |
汤姆 | 2.01 | 0 | 1 |
如果我们将1应用于"axis
"参数,我们将按列过滤数据框架。
df.filter(items=['height', 'children'], axis=1)
高度 | 儿童 | |
乔什 | 1.68 | 1 |
安吉拉 | 1.86 | 3 |
汤姆 | 2.01 | 0 |
玛丽 | 1.74 | 2 |
我们也可以将字符串"columns"
,而不是1,应用于轴参数。
df.filter(items=['height', 'children'], axis='columns')
高度 | 儿童 | |
乔什 | 1.68 | 1 |
安吉拉 | 1.86 | 3 |
汤姆 | 2.01 | 0 |
玛丽 | 1.74 | 2 |
我们注意到,输出的数据框架与顶部的数据框架是一样的,在这里我们根本没有指定"axis
" 参数。这是因为,默认情况下,如果我们不给"axis
"参数分配任何其他东西,Pandasfilter()
方法会按列过滤 数据框架。
然而,如果我们想按行过滤,而不确定 "axis "参数,我们会得到一个无用的输出。
df.filter(items=['Angela', 'Tom'])
乔希 |
安吉拉 |
汤姆 |
玛丽 |
因此,如果我们按行过滤,我们必须给 "axis
" 参数赋值 "0 "或"index"
,而如果我们按列过滤,则不一定需要 "axis
" 参数。
应用 "喜欢 "参数
到目前为止,我们已经看到了如何通过列或行名来过滤我们的数据。但是,我们也可以不通过整个项目名称来过滤,而是用特定的字母来过滤项目。例如,我们可能想只显示包含字母 "a "的行。这就是我们利用filter()
方法的 "like "参数的地方。
df.filter(like="a", axis=0)
高度 | 儿童 | 宠物 | |
安吉拉 | 1.86 | 3 | 3 |
玛丽 | 1.74 | 2 | 0 |
我们将字符串"a"
赋给 "like
" 参数,并说我们想通过将值 "0 "应用于 "轴 "参数来过滤行数据。输出显示了一个新的数据框架,其中的行项至少包含一个"a"
。无论如何,我们并不局限于在这里只使用一个字符。"like
" 参数也允许我们输入多个字符。
df.filter(like="om", axis=0)
高度 | 儿童 | 宠物 | |
汤姆 | 2.01 | 0 | 1 |
输出结果再次显示了一个数据框架。这一次,它只显示索引 "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.86 | 3 | 3 |
玛丽 | 1.74 | 2 | 0 |
正如我们所看到的,输出的数据框架显示了 "Angela "和 "Mary",因为两者都有一个 "a "在里面。
为了得到以字母 "a "结尾的项目,我们使用正则表达式。正则表达式是用来确定一个字符串是否包含一个特定的搜索模式。幸运的是,filter()
方法为我们提供了一个可选的参数 "regex
"。这样,我们就可以使用正则表达式来过滤我们的数据。
df.filter(regex='a$', axis=0)
高度 | 孩子 | 宠物 | |
安吉拉 | 1.86 | 3 | 3 |
我们将"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.68 | 1 |
安吉拉 | 1.86 | 3 |
汤姆 | 2.01 | 0 |
玛丽 | 1.74 | 2 |
输出结果与我们使用之前的这种方法完全相同。
df.filter(items=['height', 'children'], axis=1)
高度 | 儿童 | |
乔什 | 1.68 | 1 |
安吉拉 | 1.86 | 3 |
汤姆 | 2.01 | 0 |
玛丽 | 1.74 | 2 |
然而,过滤行的另一种方法是使用loc()操作。
df.loc[["Josh", "Angela"]]
高度 | 儿童 | 宠物 | |
乔什 | 1.68 | 1 | 2 |
安吉拉 | 1.86 | 3 | 3 |
在这里,我们只显示 "Josh "和 "Angela "行,将这些项目作为一个列表应用到loc()
。之前的方法,使用filter()
方法,看起来像这样。
df.filter(items=["Josh", "Angela"], axis=0)
高度 | 儿童 | 宠物 | |
乔希 | 1.68 | 1 | 2 |
安吉拉 | 1.86 | 3 | 3 |
正如我们所看到的,除了filter()
方法之外,还有几种选择来过滤我们的数据框。然而,我们在这里看到的方法只是其中的几种。还有更多的方法,但如果在这里全部展示,就有点太多。
总结
总而言之,filter()
方法是一个非常有用的工具,它很容易使用。它允许我们以许多不同的方式对数据框架的行或列进行子集。我们可以用 "items
"参数按整个项目过滤我们的数据框架,用 "like
"参数按几个字符过滤,甚至可以应用正则表达式,过滤的机会几乎是无限的。