gpt4 book ai didi

Python 3 Pandas .groupby.过滤器

转载 作者:太空狗 更新时间:2023-10-29 17:59:07 28 4
gpt4 key购买 nike

我正在尝试执行与本文档中的示例非常相似的 groupby 过滤器:pandas groupby filter

>>> df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
... 'foo', 'bar'],
... 'B' : [1, 2, 3, 4, 5, 6],
... 'C' : [2.0, 5., 8., 1., 2., 9.]})
>>> grouped = df.groupby('A')
>>> grouped.filter(lambda x: x['B'].mean() > 3.)
A B C
1 bar 2 5.0
3 bar 4 1.0
5 bar 6 9.0

我试图返回一个包含所有 3 列但只有 2 行的 DataFrame。在按 A 列分组后,这 2 行包含 B 列的最小值。我尝试了以下代码行:

grouped.filter(lambda x: x['B'] == x['B'].min())

但这不起作用,我得到了这个错误:TypeError:过滤器函数返回了一个 Series,但需要一个标量 bool

我尝试返回的 DataFrame 应该是这样的:

    A   B   C
0 foo 1 2.0
1 bar 2 5.0

如果您能提供任何帮助,我将不胜感激。预先感谢您的帮助。

最佳答案

简短的回答:

grouped.apply(lambda x: x[x['B'] == x['B']].min())

...和较长的:

您的grouped 对象有 2 个组:

In[25]: for df in grouped:
...: print(df)
...:
('bar',
A B C
1 bar 2 5.0
3 bar 4 1.0
5 bar 6 9.0)

('foo',
A B C
0 foo 1 2.0
2 foo 3 8.0
4 foo 5 2.0)
GroupBy 对象的

filter() 方法用于将组作为实体进行过滤,而不是用于过滤它们的个人行。所以使用filter()方法,你可能只会得到4个结果:

  • 一个 DataFrame(0 行),
  • “bar”组的行(3 行),
  • “foo”组的行(3 行),
  • 两个组的行(6 行)

没有别的,不管 filter() 方法中使用的参数( bool 函数)如何。


所以你必须使用其他方法。一个合适的方法是非常灵活的 apply() 方法,它可以让你应用一个任意的函数

  • 接受一个DataFrame(一组GroupBy对象)作为它的唯一参数
  • 返回一个 Pandas 对象 或一个标量

在您的情况下,该函数应该返回(对于您的 2 个组中的每一个)在 'B' 列中具有最小值的 1 行 DataFrame,因此我们将使用 bool 掩码

group['B'] == group['B'].min()

用于选择这样的一行(或者 - 可能 - 更多行):

In[26]: def select_min_b(group):
...: return group[group['B'] == group['B'].min()]

现在将此函数用作 GroupBy 对象 groupedapply() 方法的参数,我们将获得

In[27]: grouped.apply(select_min_b)
Out[27]:
A B C
A
bar 1 bar 2 5.0
foo 0 foo 1 2.0

注意:

相同,但只有一个命令(使用 lambda 函数):

grouped.apply(lambda group: group[group['B'] == group['B']].min())

关于Python 3 Pandas .groupby.过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54717473/

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