在每个组中包含特定值的新数据帧

2024-10-01 11:34:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下的数据帧

User    eve Ses
a   123 1
a   123 2
a   123 3
a   123 4
a   123 5
a   123 6
a   456 1
a   456 2
a   456 3
a   456 4
a   456 5
a   456 14
a   456 7
a   456 8
a   456 9
a   456 10
a   888 1
a   888 2
a   888 3
a   888 4
a   888 5
a   888 5
a   888 7
a   888 8
b   123 1
b   123 2
b   123 3
b   123 4
b   123 5
b   123 6
b   456 1
b   456 2
b   456 3
b   456 4
b   456 5
b   456 9
b   456 7
b   456 8
b   456 9
b   456 10
b   888 1
b   888 2
b   888 3
b   888 4
b   888 5
b   888 6
b   888 7
b   888 8

我想按User分组&eve并获取包含6或14的所有组的新数据帧

当我使用下面的代码时

df.groupby(['User','eve']).apply(lambda x: (x['Ses']==6).any()|(x['Ses']==14).any()) 我准确地得到了6个或14个组,如下所示

User  eve
a     123     True
      456     True
      888    False
b     123     True
      456    False
      888     True
dtype: bool

我只是不能使用这些信息来获取新的数据帧,它的组是True。 预期的输出是如下所示的新数据帧。有人能指引吗

User    eve Ses
a   123 1
a   123 2
a   123 3
a   123 4
a   123 5
a   123 6
a   456 1
a   456 2
a   456 3
a   456 4
a   456 5
a   456 14
a   456 7
a   456 8
a   456 9
a   456 10
b   123 1
b   123 2
b   123 3
b   123 4
b   123 5
b   123 6
b   888 1
b   888 2
b   888 3
b   888 4
b   888 5
b   888 6
b   888 7
b   888 8

Tags: 数据lambda代码falsetruedfanyeve
1条回答
网友
1楼 · 发布于 2024-10-01 11:34:39

为了提高性能,可以使用^{}^{}以及由^{}创建的掩码^{}和辅助列:

df = df[df.assign(m=df['Ses'].isin([6,14])).groupby(['User','eve'])['m'].transform('any')]
print (df)
   User  eve  Ses
0     a  123    1
1     a  123    2
2     a  123    3
3     a  123    4
4     a  123    5
5     a  123    6
6     a  456    1
7     a  456    2
8     a  456    3
9     a  456    4
10    a  456    5
11    a  456   14
12    a  456    7
13    a  456    8
14    a  456    9
15    a  456   10
24    b  123    1
25    b  123    2
26    b  123    3
27    b  123    4
28    b  123    5
29    b  123    6
40    b  888    1
41    b  888    2
42    b  888    3
43    b  888    4
44    b  888    5
45    b  888    6
46    b  888    7
47    b  888    8

应使用^{}更改您的解决方案,但如果较大的数据帧或多组解决方案速度非常慢:

df = df.groupby(['User','eve']).filter(lambda x: (x['Ses']==6).any()|(x['Ses']==14).any())

相关问题 更多 >