首页 > 解决方案 > 将列中的元素映射到其在另一列中的位置

问题描述

我有一个我无法解决的小问题。我已经尝试了几件事,但都没有成功。所以,把它放到上下文中:

我有许多位置已知的对象。在我的设置中,我什至有设备计算它们的位置(三边测量,但这对这个问题并不重要)。

Place True position Calculated position
0    X1       [A,B,C]           [A,C,D,F]
1    X2       [D,E,F]               [E,H]
2    X3         [G,H]               [G,A]

因此,在 中PlaceX1物体A,C在它们真正所在的位置D,F被检测到,但尽管它们在 中却被检测到X2。因此,要知道不应该在其中找到哪些元素,X1我执行以下操作

df['Position difference'] = df['Calculated position'].map(set) - df['True position'].map(set) 
def convert(set):
    return list(set)
df['Position difference'] = df['Position difference'].apply(convert)

返回:

Place True position Calculated position Position difference
0    X1       [A,B,C]           [A,C,D,F]              [F, D]
1    X2       [D,E,F]               [E,H]                 [H]
2    X3         [G,H]               [G,A]                 [A]

我想要做的是创建一个列,其中元素将是元素Position difference实际所在的位置:

Place True position Calculated position   Diff    Pos
0    X1       [A,B,C]           [A,C,D,F]  [D,F]  X2,X2
1    X2       [D,E,F]               [E,H]    [H]     X3
2    X3         [G,H]               [G,A]    [A]     X1

我尝试使用 df.iloc,但它变得如此凌乱,我不知道该怎么做。最终游戏是能够说出一个元素离它的实际位置有多远。例如,如果X1,X2,X3彼此相邻,则D,F发现距离它们实际所在的位置 1 节。

非常感谢任何提示。

标签: python-3.xpandas

解决方案


这里有一些代码可以帮助您入门:

def func():
    l, d = [], {}
    for p, t, c in df.to_numpy():
        l.append([*set(c) - set(t)])
        d.update(dict.fromkeys(t, p))
    
    for item in l:
        yield item, ','.join(map(d.get, item))

df[['diff', 'Pos']] = [*func()]

print(df)

  Place True position Calculated position    diff    Pos
0    X1     [A, B, C]        [A, C, D, F]  [F, D]  X2,X2
1    X2     [D, E, F]              [E, H]     [H]     X3
2    X3        [G, H]              [G, A]     [A]     X1

推荐阅读