Python 从多列中指定唯一值(允许值)

Python 从多列中指定唯一值(允许值),python,pandas,Python,Pandas,我正在努力从多个允许值(其他列)中为列/索引分配唯一值。例如: 所以我会将顶点4或2指定给边0,将顶点1或2指定给边1,等等。但是,每个边都应该指定一个唯一的顶点 所以如果我取edge0=vertex4,edge1=vertex1,edge2=vertex3。。。然后,边3只能在顶点1或顶点4之间进行选择,而顶点1或顶点4已被其他边之一占据 在这种情况下,edge0=顶点2、edge1=顶点1、edge2=顶点3和edge3=顶点4都可以工作 最后,仍然会有一些组合会留下一条没有唯一顶点的“边

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

所以我会将顶点4或2指定给边0,将顶点1或2指定给边1,等等。但是,每个边都应该指定一个唯一的顶点

所以如果我取edge0=vertex4,edge1=vertex1,edge2=vertex3。。。然后,边3只能在顶点1或顶点4之间进行选择,而顶点1或顶点4已被其他边之一占据

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

最后,仍然会有一些组合会留下一条没有唯一顶点的“边”,但该边应该只得到一个NaN值左右

提前感谢您的帮助

欢呼,
格伦

必须有一个更优雅的解决方案,但这至少会起到作用

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}

是否每个顶点都有最大数量的相邻边?如果是,该数量是多少?如果它大于2,则没有通解。每条边始终有两个顶点。但是一个顶点可以有更多的边,这就是我将这些边设置为NaN的意思,但只有当我们确定没有其他组合可以工作时(就像在我的示例中,不应该有NaN),才有可能为每条边指定一个元组?这样,每个边都可以有一个唯一的两个数字元组,毫无例外。如果你只是沿着一条闭合的循环线走,这就有了一个数学解。如果您查看的是一般网格,则不存在无歧义的解决方案,但总会有大量的解决方案。在您的示例中,您有一个带有悬垂尾巴的三角形,您可以顺时针或逆时针遍历该三角形,两者都可以。在可能有许多路径的更复杂的网格中,最好只采用您能找到的最早的组合,该组合具有指定给边的
N
唯一顶点,对应于图形中的
N
实际唯一顶点..可能有一些打字错误,如函数调用中的方括号…请稍候