从多个列中分配唯一值(允许值)

时间:2018-08-16 08:32:54

标签: python pandas

我正在努力为多个允许值(其他列)中的列/索引分配唯一值。例如: see this small table

所以我可以将顶点4或2分配给边0,将顶点1或2分配给边1,依此类推。但是,每个边都应该有一个唯一的顶点!

因此,如果我用edge0 =顶点4,edge1 =顶点1,edge2 =顶点3 ... ...,那么edge3只能在顶点1或4之间进行选择,而顶点1或4已被其他边之一取走。

在这种情况下,edge0 =顶点2,edge1 =顶点1,edge2 =顶点3和edge3 =顶点4可以正常工作!

最后,仍然会有一些组合,这些组合将留下没有唯一顶点的“边缘”,但是此边缘应仅获得一个NaN值。

预先感谢您的帮助!

加油, 格伦

1 个答案:

答案 0 :(得分:0)

必须对此有一个更优雅的解决方案,但这至少可以解决问题。

u1 = set(df["Vertex1"])
u2 = set(df["Vertex2"])
sd = u1.symmetric_difference(u2)
ist = u1.intersection(u2)
edge = {}
for i, v in enumerate(df.index):
    vert1 = df["Vertex1"].iloc[i]
    vert2 = df["Vertex2"].iloc[i]
    if vert1 in sd:
        edge[v] = vert1
        sd.discard(vert1)
    elif vert2 in sd:
        edge[v] = vert2
        sd.discard(vert2)
    elif vert1 in ist:
        edge[v] = vert1
        ist.discard(vert1)
    elif vert2 in ist:
        edge[v] = vert2
        ist.discard(vert2)
    else:
        edge[v] = math.nan

print(edge)
#{0: 2, 1: 1, 2: 3, 3: 4}