gpt4 book ai didi

Python Pandas groupby : filter according to condition on values

转载 作者:行者123 更新时间:2023-11-28 18:24:40 25 4
gpt4 key购买 nike

考虑如下数据框。

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 值之一不在 之间,我想用 bar 过滤掉行lower_boundupper_bound

在上面的示例中,应过滤掉具有 bar = 002 的行,因为并非所有具有 bar = 002 的行都包含值 foo-55 之间(即,行索引 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:过滤器必须返回一个 bool 结果。此外,当我希望结果返回数据框对象时,这种方法可能会返回一个 groupby 对象。

最佳答案

您很可能不会使用 andor,而是将 &|pandas 一起使用,对于你的情况,然后在过滤器中应用 all() 函数来构造 bool 条件,这将保留 bar 所有对应的 foo 值介于 lower_boundupper_bound 之间:

df1.groupby('bar').filter(lambda x: ((x.foo >= lower_bound) & (x.foo <= upper_bound)).all())

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

关于Python Pandas groupby : filter according to condition on values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42240476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com