【问题标题】:Pandas .filter() method with lambda function [duplicate]带有 lambda 函数的 Pandas .filter() 方法
【发布时间】:2018-06-26 13:19:23
【问题描述】:

我正在尝试理解 Pandas 中的 .filter() 方法。我不确定为什么下面的代码不起作用:

# Load data
from sklearn.datasets import load_iris
import pandas as pd
data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)

# Set arbitrary index (is this needed?) and try filtering:
indexed_df = df.copy().set_index('sepal width (cm)')
test = indexed_df.filter(lambda x: x['petal length (cm)'] > 1.4)

我明白了:

TypeError: 'function' object is not iterable

我很欣赏有更简单的方法可以做到这一点(例如布尔索引),但我试图理解为什么 filter 在适用于 groupby 时会在此处失败,如下所示:

这行得通:

 filtered_df = df.groupby('petal width (cm)').filter(lambda x: x['sepal width (cm)'].sum() > 50)

【问题讨论】:

  • 链接到的文档有四个参数:itemslikeregexaxis。 (如果您阅读文档)都不接受函数/lambda 表达式。
  • filter 用于根据列名的部分匹配和正则表达式匹配来选择列。
  • 你应该只使用普通的布尔索引。
  • 谢谢威廉(和其他人)。我可以很高兴地通过布尔索引来做——我问的唯一原因是它是 DataCamp 课程的一个例子,尽管使用了groupby,然后是 filterlambda 函数。这部分对我来说仍然不清楚,因为它与 groupby 一起使用 - 我将编辑问题以使其明确。
  • 要清楚,这不是布尔索引问题的完全重复,它是关于为什么 filtergroupby 一起工作而不是没有。

标签: python pandas


【解决方案1】:

您可以使用条件indexed_df['petal length (cm)'] > 1.4(这里我们使用indexed_df,而不是x)作为过滤数据框的一种方式,因此:

indexed_df[indexed_df['petal length (cm)'] > 1.4]

这是如何工作的?

如果您执行indexed_df['petal length (cm)'],您将获得数据帧的“”:某种序列,对于每个索引,我们都会获得该列的值。通过执行column > 1.4,我们获得了某种布尔列:True 如果某行满足条件,否则False

然后我们可以使用这样的布尔列作为数据框indexed_df[boolean_column]的元素,仅获取boolean_column对应行为True的行。

【讨论】:

  • 谢谢,但如上所述,这并不能解释为什么 lambda 函数在与 groupby 一起使用时会起作用,因为现在包含在已编辑的答案中。
猜你喜欢
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2017-08-23
  • 1970-01-01
相关资源
最近更新 更多