gpt4 book ai didi

python - 根据另一列的条件,根据一列的最大值是否等于特定值来过滤组

转载 作者:太空宇宙 更新时间:2023-11-03 14:37:50 25 4
gpt4 key购买 nike

我想切片(或过滤)属于 d2.groupby('g') 中的组的那些组(虽然,我会满足于行。)组中 s 的值,对于 test1 的行,为 2。

pd.__version__
# '0.24.1'

d2 = pd.DataFrame({'g': [1, 1, 1, 2, 2, 2],
'test': [1, 1, 0, 1, 0, 0],
's': [1, 2, 3, 1, 2, 3]})

d2
g test s
0 1 1 1
1 1 1 2
2 1 0 3
3 2 1 1
4 2 0 2
5 2 0 3

用简单的英语来说:我想保留相应的 test 值为 1 的 s 的最大值为 2 的组。对于下面的示例,我想保留 g1 因为第二行有 test == 1s == 2,第三行有s == 0。此数据的预期输出:

   g  test  s
0 1 1 1
1 1 1 2
2 1 0 3

我试过 d2.groupby('g').filter(lambda x: (x.test == 1)) # followed by nonsense,以及 d2. groupby('g')[[d2.s == 1]] # 废话更多.后者给我的信息是 Series 对象是可变的和不可散列的。我尝试过许多其他同样毫无意义和无用的方法。 我如何groupby('g') 并根据 s 的最大值进行过滤,其中 test1? 这看起来应该很容易,但我做不到。我可以通过添加一列来达到目的,但这似乎是一种拼凑。

注意:我已经搜索了这个问题的答案。如果有的话,我很乐意接受有关如何找到该问题的任何当前解决方案的任何搜索提示。谢谢!

最佳答案

您可以使用 groupbytransform 来计算掩码,如下所示:

df[df['s'].where(df['test'] == 1).groupby(df['g']).transform('max') == 2]

g test s
0 1 1 1
1 1 1 2
2 1 0 3

Series.where 背后的想法是让我们只考虑“test”为 1 的“s”的值。

这是一个类似的版本,灵感来自 WeNYoBen,它可以工作,因为“test”在这里是 0 或 1。

df[df['s'].mul(df['test']).groupby(df['g']).transform('max').eq(2)]

g test s
0 1 1 1
1 1 1 2
2 1 0 3

关于python - 根据另一列的条件,根据一列的最大值是否等于特定值来过滤组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56267133/

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