确定给定X / Y坐标的数据的相反顺序

时间:2019-06-14 15:12:46

标签: python pandas

想象一下电连接器。它有别针。每个引脚在空间中都有一个对应的X / Y位置。我试图弄清楚如何镜像或“翻转”给定其X / Y坐标的连接器上的每个引脚。注意:我使用的是23.4版本的pandas Rough Paint Sketch Visual,我们可以假设x,y和pin不是唯一的,而连接器是唯一的。连接器可以是任意大小,因此,两排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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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

答案 2 :(得分: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