Pandas .filter()方法结合lambda函数报错原因咨询
为什么Pandas中
DataFrame.filter()报错,而groupby.filter()可以正常运行? 嘿,我来帮你理清这个问题!你碰到的核心问题是Pandas里的DataFrame.filter()和groupby.filter()是完全不同的两个方法,它们的参数要求和功能天差地别,这就是为什么你的代码报错,而groupby的例子能正常运行。
1. 先搞懂DataFrame.filter()的真实用途
DataFrame.filter()根本不是用来做行过滤的!它的设计目的是筛选列或者索引(行标签),只能根据名称来匹配,接受的参数是:
items: 要保留的列/索引名称列表like: 包含指定字符串的列/索引名称regex: 符合正则表达式的列/索引名称axis: 指定是筛选列(0/默认)还是索引(1)
你传一个lambda函数给它,它完全不知道怎么处理——因为这个方法期望的是可迭代的名称规则,而不是一个函数,所以就抛出了TypeError: 'function' object is not iterable的错误。
举个正确使用DataFrame.filter()的例子:
# 筛选名称包含"petal"的列 filtered_cols = indexed_df.filter(like='petal')
2. 为什么groupby.filter()可以用lambda?
groupby.filter()是专门为分组后的行过滤设计的,它的参数就是一个函数(比如lambda):
- 这个函数会被应用到每一个分组的子DataFrame上
- 函数需要返回一个布尔值(True/False)
- 如果返回True,整个分组的行都会被保留;返回False则整个分组被丢弃
你的例子里,lambda x: x['sepal width (cm)'].sum() > 50就是对每个分组计算萼片宽度的总和,判断是否大于50,符合这个方法的参数要求,所以能正常运行。
3. 解决你的需求:如何用类似lambda的方式做行过滤?
你想实现的“筛选petal length >1.4的行”,正确的做法有这些:
方法1:布尔索引(最常用)
test = indexed_df[indexed_df['petal length (cm)'] > 1.4]
方法2:用df.loc配合lambda
如果你非要用lambda的形式,可以用loc,它支持传入lambda函数:
test = indexed_df.loc[lambda x: x['petal length (cm)'] > 1.4]
方法3:df.query()(更简洁的语法)
test = indexed_df.query('`petal length (cm)` > 1.4')
另外你问的“设置任意索引是否必要?”——完全没必要!设置索引和你要做的行过滤没有关系,反而因为误解了filter()的用途,导致走了弯路。
内容的提问来源于stack exchange,提问作者User123456789
相关产品推荐
相关产品推荐

