我有一个以下形式的数据集(大约8000行)
Employee ID | Manager ID
a | b
c | b
b | e
d | e
e | f我想将其转换为一个表单,其中显示了最低层级的员工和“最高”层级的所有经理之间的整个“链接”,即:
Employee ID | Manager ID 1 | Manager ID 2 | Manager ID 3
a | b | e | f
c | b | e | f
d | e | f在Python语言中使用pandas进行计算最有效的方法是什么?
发布于 2020-01-31 18:26:01
这是一个使用numpy而不是pandas的解决方案,但它可能会对您有所帮助:
employee = np.array(['a', 'c', 'b', 'd', 'e', 'f']) # Add 'f' as employee
manager = np.array(['b', 'b', 'e', 'e', 'f', 'f']) # being his own manager获取每个员工的经理编号(sorry):
manager_idx = np.array([np.where(employee == mng)[0] for mng in manager]).ravel()循环到层次结构的末尾。
manager_idx_list = [manager_idx]
while True:
new_manger_idx = manager_idx_list[-1][manager_idx]
if all(new_manger_idx == manager_idx_list[-1]):
break
else:
manager_idx_list.append(new_manger_idx)
manager_list = np.array([employee[mng_idx] for mng_idx in manager_idx_list]).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']]发布于 2020-02-01 03:33:40
这更多地涉及到图和树理论。熊猫并不擅长这一领域。对于这类问题,networkx更合适。我提出了一个使用networkx的解决方案。在处理之前,您需要安装或pip networkx。
从您的数据帧构建DiGraph。获取图的leaves列表。对shortest_path使用列表理解,以获取从每个root到leaf的节点列表
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 Nonehttps://stackoverflow.com/questions/60001108
复制相似问题