根据一列的最大值(取决于另一列的条件)是否等于特定值过滤组

时间:2019-05-23 01:57:38

标签: python pandas dataframe group-by pandas-groupby

我想切片(或过滤掉)属于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

简而言之:我想保留s对应的test值为1的最大值为{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 nonsensed2.groupby('g')[[d2.s == 1]] # with more nonsense。后者向我传达了有关Series对象可变和不可散列的信息。我尝试了许多其他同样无意义和无用的方法。 我如何groupby('g')并按s的最大值test进行过滤,其中1login(user) { var id = "0x30333142303231432D303430442D303541322D463830362D344430373030303830303039"; var params = `username=${user.username} &password=${user.password} &uuid=${uuid}`; return httpModule.request({ url: `https://example.com/index.php?act=login`, <-- maybe append here id=id&username=username like this content: String({ <--- like this ? username: user.username, password: user.password, id: id }), method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", "X-Requested-With": "XMLHttpRequest", "User-Agent": "XYZ", "Referer": "Mayak" } }).then((response) => { let result = response.content.toJSON(); console.log(result) return result; }, (e) => { console.log(e); }); } 这似乎应该很容易,但是我可以不明白。我可以通过添加一列来到达那儿,但这似乎有点麻烦。

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

2 个答案:

答案 0 :(得分:2)

您可以使用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启发的类似版本,该版本将起作用,因为此处的“测试”为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

答案 1 :(得分:2)

使用filter

d2.groupby('g').filter(lambda x : (x['s']*x['test']).max()==2)
Out[390]: 
   g  s  test
0  1  1     1
1  1  2     1
2  1  3     0

使用isin 的另一种方法,因为filter在大数据帧中通常较慢

s=d2.s.mul(d2.test).groupby(d2['g']).max()==2
d2.loc[d2.g.isin(s.index[s])]
Out[394]: 
   g  s  test
0  1  1     1
1  1  2     1
2  1  3     0