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

2024-06-17 13:10:01 发布

您现在位置:Python中文网/ 问答频道 /正文

想象一个电连接器。它有别针。每个管脚在空间中都有相应的X/Y位置。我正试图找出如何镜像,或'翻转'连接器上的每个引脚给他们的X/Y坐标。注意:我使用的是pandas版本23.4Rough Paint Sketch Visual我们可以假设x、y和pin不是唯一的,但是connector是唯一的。连接器可以是任何尺寸,所以两排5个,三排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

Tags: 数据版本pandasconnector镜像尺寸pin空间
3条回答
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

IIUC尝试使用[::-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

可以在原始坐标和“翻转”组件的坐标之间创建贴图。然后可以选择翻转的值。你知道吗

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

相关问题 更多 >