首页 > 解决方案 > 在 pandas df 中识别具有相同员工的连接项目

问题描述

我想检查两个项目是否通过从事这些项目的人员联系起来。一个新的 df 应该表明任何两个项目是如何连接的。

直接相关:第一个项目中至少有一个人参与了第二个项目(connection=0),

或间接相关:第一个项目的一个人与第二个项目的一个人在另一个项目上工作(connection=1)。

原始 df 如下所示:

>>> import pandas as pd
>>> df_1 = pd.DataFrame({'person':['A','A','B','B','C','C','D'],
...                     'project':['P1','P2','P1','P4','P2','P3','P3'],
...                     'year':[2003,2004,2003,2006,2004,2005,2005]})
>>> df_1
  person project  year
0      A      P1  2003
1      A      P2  2004
2      B      P1  2003
3      B      P4  2006
4      C      P2  2004
5      C      P3  2005
6      D      P3  2005

新创建的 df_2 应该如下所示:

>>> df_2 = pd.DataFrame({'first_project':['P1','P1','P1','P2','P2'],
...                      'second_project':['P2','P3','P4','P3','P4'],
...                      'connection':[0,1,0,0,1]})
>>> df_2
  first_project second_project  connection
0            P1             P2           0
1            P1             P3           1
2            P1             P4           0
3            P2             P3           0
4            P2             P4           1

知道什么是最快的方法吗?df_1 中有数百万个项目提前致谢!

标签: pythonpandasdataframe

解决方案


对于connection=0,您可以在 person 上将数据框与其自身合并并删除重复的项目,其余的将是具有connection=0.

以下是您的操作方法:

df_connection_zero = df.merge(df, left_on="person", right_on="person", suffixes = ("_first","_second"))
df_connection_zero = df_connection_zero[df_connection_zero["project_first"] !=df_connection_zero["project_second"]].drop_duplicates(subset=["person"])
df_connection_zero = df_connection_zero[["project_first","project_second"]]
df_connection_zero["connection"] = 0

我们会得到:

 project_first project_second  connection
            P1             P2           0
            P1             P4           0
            P2             P3           0

因为connection=1,它似乎有点复杂,如果我找到方法,我会告诉你。


推荐阅读