Python 使用逗号分隔值进行查找时筛选数据

Python 使用逗号分隔值进行查找时筛选数据,python,pandas,lambda,filter,slice,Python,Pandas,Lambda,Filter,Slice,我有以下数据框,表示员工编号、他们所在的部门以及他们在公司中的角色代码,可以是“1”或“2”。在“部门名称”列中,您可以选择员工所属的部门(命名约定为“XX:Dept Name”,其中XX是国家代码),或者在某些情况下,它显示为一组部门,以逗号分隔,并带有员工在这些部门中的角色。它看起来像这样: Department Name Employee Number Role Code 0 AU:Dept1

我有以下数据框,表示员工编号、他们所在的部门以及他们在公司中的角色代码,可以是“1”或“2”。在“部门名称”列中,您可以选择员工所属的部门(命名约定为“XX:Dept Name”,其中XX是国家代码),或者在某些情况下,它显示为一组部门,以逗号分隔,并带有员工在这些部门中的角色。它看起来像这样:

  Department Name                Employee Number      Role Code   
0  AU:Dept1                         1000                     1
1  AU:Dept1, AU:Dept3               1000                     2
2  AU:Dept7                         1000                     1
3  CZ:Dept3                         1001                     2
4  CZ:Dept4, CZ:Dept6, CZ:Dept7     1001                     2
5  CZ:Dept4                         1001                     1 
6  PL:Dept1                         1002                     2
7  PL:Dept2, PL:Dept1               1002                     1
8  PL:Dept3                         1002                     2
9  SG:Dept1                         1003                     1
10 SG:Dept1                         1003                     2
11 SG:Dept2                         1003                     2
员工在每个唯一的部门名称中只能有角色1或角色2,因此我需要创建一个代码,该代码将返回所有冲突行,其中员工似乎在同一部门中同时有角色1和角色2。这就是输出:

  Department Name                Employee Number      Role Code   
0  AU:Dept1                         1000                     1
1  AU:Dept1, AU:Dept3               1000                     2
4  CZ:Dept4, CZ:Dept6, CZ:Dept7     1001                     2
5  CZ:Dept4                         1001                     1 
6  PL:Dept1                         1002                     2
7  PL:Dept2, PL:Dept1               1002                     1
9  SG:Dept1                         1003                     1
10 SG:Dept1                         1003                     2

执行此筛选的最佳方法是什么?

让我们尝试拆分部门名称,然后在
['Employee',Name']
上进行
groupby
,以找出哪些员工有两个角色
nunique

(df.assign(Name=df['Department Name'].str.split(', '))
   .explode('Name')
   .loc[lambda x:x.groupby(['Employee Number','Name'])
                 ['Role Code'].transform('nunique') ==2 ]
   .drop('Name', axis=1)
)
输出:

                 Department Name  Employee Number  Role Code
0                       AU:Dept1             1000          1
1             AU:Dept1, AU:Dept3             1000          2
4   CZ:Dept4, CZ:Dept6, CZ:Dept7             1001          2
5                       CZ:Dept4             1001          1
6                       PL:Dept1             1002          2
7             PL:Dept2, PL:Dept1             1002          1
9                       SG:Dept1             1003          1
10                      SG:Dept1             1003          2

你可以这样做

df['both_role'] = df.groupby('Employee Number')['Role Code'].isin([1]).astype(int) * df.groupby('Employee Number')['Role Code'].isin([2]).astype(int) 

df[df.both_role == 1]

您可以使用员工编号进行分组,并检查每个用户的角色代码是否包含1和2。如果同时包含1和2,则可以筛选数据帧。

您尝试过吗?邮政编码。我们可以帮助您解决代码中的具体问题。对不起,我正在度假,已经接受了答案,谢谢!