使用Python将成对比较列表转换为层次表示(列)

使用Python将成对比较列表转换为层次表示(列),python,pandas,data-structures,pairwise,Python,Pandas,Data Structures,Pairwise,我有一个如下形式的数据集(大约8000行) 我想将其转换为一个表格,其中显示最低层级的员工与最高层级的所有经理之间的整个“链接”,即: Employee ID | Manager ID 1 | Manager ID 2 | Manager ID 3 a | b | e | f c | b | e | f d | e | f 在Python中使用pandas最有效的计算方法是什么?这里有一个使用numpy而不是pandas的解决方案,但它可能会帮助您: employee=np.array(['a

我有一个如下形式的数据集(大约8000行)

我想将其转换为一个表格,其中显示最低层级的员工与最高层级的所有经理之间的整个“链接”,即:

Employee ID | Manager ID 1 | Manager ID 2 | Manager ID 3
a | b | e | f
c | b | e | f
d | e | f

在Python中使用
pandas
最有效的计算方法是什么?

这里有一个使用
numpy
而不是
pandas
的解决方案,但它可能会帮助您:

employee=np.array(['a','c','b','d','e','f'])#添加'f'作为employee
manager=np.array(['b','b','e','e','f','f'])作为他自己的管理者
获取每个员工的经理编号():

manager\u idx=np.array([np.where(employee==mng)[0]表示管理器中的mng]).ravel()
循环,直到到达层次结构的末尾

manager\u idx\u list=[manager\u idx]
尽管如此:
新经理idx=经理idx列表[-1][经理idx]
如果全部(新经理idx==经理idx列表[-1]):
打破
其他:
经理idx列表。追加(新经理idx)
manager\u list=np.array([employee[mng\u idx]代表manager\u idx\u list中的mng\u idx]).T
#'a':['b'e'f']
#“c”:[b”“e”“f']
#“b”:[e”f“f']
#'d':['e'f'f']
#“e”:[f”“f”“f']
#“f”:[f”“f”“f']]

这与图论和树论有更多的关系。熊猫不是这个领域的专家。对于这种情况,networkx更合适。我提出了一个使用networkx的解决方案。在处理之前,您需要安装或
pip

从数据帧构造一个
有向图。获取图表的
叶子列表。使用列表理解和
最短路径
获取从每个

import networkx as nx

G = nx.from_pandas_edgelist(df, 'Employee ID', 'Manager ID', create_using=nx.DiGraph)
leaves = [node for node in G if G.out_degree(node)==0]
data   = [nx.shortest_path(G, node, leaf) for node in G if G.in_degree(node)==0 
                                               for leaf in leaves]
manager_cols = [f'Manager ID {i}' for i in range(1, df['Manager ID'].nunique()+1)]

df_final = pd.DataFrame(data, columns=['Employee ID', *manager_cols])

Out[371]:
  Employee ID Manager ID 1 Manager ID 2 Manager ID 3
0           a            b            e            f
1           c            b            e            f
2           d            e            f         None

回答得很好。但假设有两个行管理器(即多个最短路径),如何在最终输出中将两个变量作为单独的行返回?
import networkx as nx

G = nx.from_pandas_edgelist(df, 'Employee ID', 'Manager ID', create_using=nx.DiGraph)
leaves = [node for node in G if G.out_degree(node)==0]
data   = [nx.shortest_path(G, node, leaf) for node in G if G.in_degree(node)==0 
                                               for leaf in leaves]
manager_cols = [f'Manager ID {i}' for i in range(1, df['Manager ID'].nunique()+1)]

df_final = pd.DataFrame(data, columns=['Employee ID', *manager_cols])

Out[371]:
  Employee ID Manager ID 1 Manager ID 2 Manager ID 3
0           a            b            e            f
1           c            b            e            f
2           d            e            f         None