确定给定X/Y坐标的数据的倒序

3

想象一个电气连接器。它有插针。每个插针在空间中都有对应的X/Y位置。我正在尝试找出如何根据它们的X/Y坐标镜像或“翻转”连接器上的每个插针。 注意:我使用的是 pandas 版本23.4 草图可视化 我们可以假设 x、y 和 pin 不是唯一的,但 connector 是唯一的。连接器可以是任何大小,例如两行 5 个插针,3 行 6 个插针等。

x    y    pin   connector
1    1     A       1
2    1     B       1
3    1     C       1
1    2     D       1
2    2     E       1
3    2     F       1  
1    1     A       2
2    1     B       2
3    1     C       2
1    2     D       2
2    2     E       2
3    2     F       2

数据框列 'flip' 是我尝试达成的解决方案。请注意,原来在同一行中的引脚现在顺序相反。
x    y    pin    flip   connector
1    1     A       C        1
2    1     B       B        1
3    1     C       A        1
1    2     D       F        1
2    2     E       E        1
3    2     F       D        1  
1    1     A       C        2
2    1     B       B        2
3    1     C       A        2
1    2     D       F        2
2    2     E       E        2
3    2     F       D        2

我有一种感觉,好像昨天看到过这个问题。 - Quang Hoang
@QuangHoang 是的,我已经删除了它并尝试使其更加详尽/清晰。 - MaxB
你有尝试过任何东西吗? - harvpan
昨天的答案出了什么问题? - Quang Hoang
@QuangHoang 这些答案被删除了,因为它们没有解决整个问题(这是我的错)。 - MaxB
3个回答

4

如果我理解正确,可以尝试使用反转元素[::-1]groupbytransform

df['flip'] = df.groupby(['connector','y'])['pin'].transform(lambda x: x[::-1])

输出:

    x  y pin  connector flip
0   1  1   A          1    C
1   2  1   B          1    B
2   3  1   C          1    A
3   1  2   D          1    F
4   2  2   E          1    E
5   3  2   F          1    D
6   1  1   A          2    C
7   2  1   B          2    B
8   3  1   C          2    A
9   1  2   D          2    F
10  2  2   E          2    E
11  3  2   F          2    D

1
我相信这可能会奏效,我想再试着玩弄一下。 - MaxB

1
import io
import pandas as pd

data = """
x    y    pin   connector
1    1     A       1
2    1     B       1
3    1     C       1
1    2     D       1
2    2     E       1
3    2     F       1
1    1     A       2
2    1     B       2
3    1     C       2
1    2     D       2
2    2     E       2
3    2     F       2
"""

#strip blank lines at the beginning and end
data = data.strip()

#make it quack like a file
data_file = io.StringIO(data)

#read data from a "wsv" file (whitespace separated values)
df = pd.read_csv(data_file, sep='\s+')

创建新列:
flipped = []

for name, group in df.groupby(['connector','y']):
    flipped.extend(group.loc[::-1,'pin'])

df = df.assign(flip=flipped)

df

最终数据框:
    x   y   pin     connector   flip
0   1   1   A       1           C
1   2   1   B       1           B
2   3   1   C       1           A
3   1   2   D       1           F
4   2   2   E       1           E
5   3   2   F       1           D
6   1   1   A       2           C
7   2   1   B       2           B
8   3   1   C       2           A
9   1   2   D       2           F
10  2   2   E       2           E
11  3   2   F       2           D

我认为 flipped.extend(group.loc[::-1,'x']) 正在用 'x' 值而不是 'pin' 值填充 'flip' 列。 - MaxB
1
@MaxB 已经更正。 - RootTwo

0

你可以创建一个将原始坐标与“翻转”组件坐标之间建立映射的方法。接着,您就可以选择翻转后的数值。

import numpy as np

midpoint = 2

coordinates_of_flipped = pd.MultiIndex.from_arrays([df['x'].map(lambda x: x - midpoint  * np.sign(x - midpoint )), df['y'], df['connector']])

df['flipped'] = df.set_index(['x', 'y', 'connector']).loc[coordinates_of_flipped].reset_index()['pin']

这提供了

Out[30]: 
    x  y pin  connector flipped
0   1  1   A          1       C
1   2  1   B          1       B
2   3  1   C          1       A
3   1  2   D          1       F
4   2  2   E          1       E
5   3  2   F          1       D
6   1  1   A          2       C
7   2  1   B          2       B
8   3  1   C          2       A
9   1  2   D          2       F
10  2  2   E          2       E
11  3  2   F          2       D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接