Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确定给定X/Y坐标的数据的逆序_Python_Pandas - Fatal编程技术网

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

Python 确定给定X/Y坐标的数据的逆序,python,pandas,Python,Pandas,想象一个电气连接器。它有别针。每个管脚在空间中都有相应的X/Y位置。我正试图找出如何镜像或“翻转”给定X/Y坐标的连接器上的每个管脚。注意:我使用的是pandas版本23.4,我们可以假设x、y和引脚不是唯一的,但连接器是唯一的。连接器可以是任何尺寸,所以两排5,3排6,等等 x y pin connector 1 1 A 1 2 1 B 1 3 1 C 1 1 2 D 1 2

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

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]
反向元素和
groupby
转换一起使用:

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

我觉得我昨天看到了这个问题。@QuangHoang是的,我删除了它并试图使它更彻底/清晰。你试过了吗?昨天的答案有什么问题吗?@QuangHoang答案被删除了,因为它们没有解决整个问题(我的错)。我想
翻转了。扩展(group.loc[:-1,'x'])
正在用“x”值而不是“pin”填充“flip”列。@MaxB已更正。我相信这可能会奏效,我想多玩玩一下。
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