【问题标题】:Python Pandas groupby: filter according to condition on valuesPython Pandas groupby:根据值的条件过滤
【发布时间】:2023-04-02 09:34:02
【问题描述】:

考虑如下的数据框。

import pandas as pd

# Initialize dataframe
df1 = pd.DataFrame(columns=['bar', 'foo'])
df1['bar'] = ['001', '001', '001', '001', '002', '002', '003', '003', '003']
df1['foo'] = [-1, 0, 2, 3, -8, 1, 0, 1, 2]
>>> print df1
   bar  foo
0  001   -1
1  001    0
2  001    2
3  001    3
4  002   -8
5  002    1
6  003    0
7  003    1
8  003    2

# Lower and upper bound for desired range
lower_bound = -5
upper_bound = 5

我想在 Pandas 中使用 groupby 来返回一个数据框,该数据框过滤掉符合条件的 bar 行。特别是,如果此 barfoo 值之一不在 lower_boundupper_bound 之间,我想过滤掉带有 bar 的行。

在上面的例子中,bar = 002 的行应该被过滤掉,因为不是所有bar = 002 的行在-55 之间都包含foo 的值(即行索引4包含foo = -8)。此示例所需的输出如下。

# Desired output
   bar  foo
0  001   -1
1  001    0
2  001    2
3  001    3
6  003    0
7  003    1
8  003    2

我尝试了以下方法。

# Attempted solution
grouped = df1.groupby('bar')['foo']
grouped.filter(lambda x: x < lower_bound or x > upper_bound)

但是,这会产生 TypeError: the filter must return a boolean result。此外,当我希望结果返回一个数据框对象时,这种方法可能会返回一个 groupby 对象。

【问题讨论】:

    标签:
    python
    pandas