我想切片(或过滤掉)属于d2.groupby('g')
中的组的那些组(尽管我要排成一行。),其中该组中s
的最大值,对于test
为1
的行为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}的组。对于以下示例,我希望保留g
组1
,因为第二行包含test == 1
和s == 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]] # with more nonsense
。后者向我传达了有关Series对象可变和不可散列的信息。我尝试了许多其他同样无意义和无用的方法。 我如何groupby('g')
并按s
的最大值test
进行过滤,其中1
是login(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);
});
}
?这似乎应该很容易,但是我可以不明白。我可以通过添加一列来到达那儿,但这似乎有点麻烦。
注意:我已经找到了答案。我很乐意接受有关如何找到该问题的当前解决方案的任何搜索提示(如果有的话)。谢谢!
答案 0 :(得分:2)
您可以使用groupby
和transform
来计算掩码,如下所示:
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