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