我有一个 pandas 数据框,其中包含基于节点的链接信息和以特定节点结束的链接。 对于此信息,我想添加有关相反方向链接的信息。 数据框看起来像这样(只是一个示例):
atNode l1no l1ln l2no l2ln l3no l3ln l4no l4ln l5no l5ln l6no l6ln
0 10000 10180 2 10046 1 10183 2 0 0 0 0 0 0
1 10001 10131 2 10003 1 10188 2 0 0 0 0 0 0
2 10002 10188 2 10005 1 10130 2 0 0 0 0 0 0
8 10009 10131 0 0 0 0 0 0 0 0 0 0 0
13 10046 10000 1 10317 2 10222 1 10346 2 0 0 0 0
30 10131 10138 0 10009 2 10415 2 10001 2 0 0 0 0
66 10180 10000 2 10032 2 10221 1 0 0 0 0 0 0
72 10188 10001 1 10002 1 0 0 0 0 0 0 0 0
我想要得到的是:6个额外的列(
l1op
,l2op
,...l6op
),其值为l
Xln
,但方向相反(例如:l1no
= atNode
, atNode
= l1no
)
我的意思是:对于第一行,我想要 l1op
= 2(来自第 66 行),l2op
= 1(来自第 13 行),等等...
我想这里的主要问题是制作一个地图(掩码?)什么索引包括l
Xno列中的
atNode
值,然后找到lYno的哪一列有atNode
(来自lXno) ,然后...使用 lYln 作为 lXop .
我可能可以制作 6 个循环(每个节点最多 6 个链接)并逐列合并数据,但是(这会很慢并且)我认为有更多“Pythonic”方法可以做到这一点,我正在考虑使用
map
,mask
,where
...但我的经验还不够,无法以这种方式工作。
有什么想法吗?
对于每个
lxno
列,将该列与 atnode
一起设置为数据帧的索引,然后交换级别以创建另一个具有恢复索引的数据帧。然后使用多索引映射从 lxln
列中提取值并将其分配给 lxop
for i in range(1, 7):
s1 = df.set_index(['atNode', f'l{i}no'])
s2 = s1.swaplevel()
df[f'l{i}op'] = s1.index.map(s2[f'l{i}ln'])
atNode l1no l1ln l2no l2ln l3no l3ln l4no l4ln l5no l5ln l6no l6ln l1op l2op l3op l4op l5op l6op
0 10000 10180 2 10046 1 10183 2 0 0 0 0 0 0 2.0 NaN NaN NaN NaN NaN
1 10001 10131 2 10003 1 10188 2 0 0 0 0 0 0 NaN NaN NaN NaN NaN NaN
2 10002 10188 2 10005 1 10130 2 0 0 0 0 0 0 NaN NaN NaN NaN NaN NaN
8 10009 10131 0 0 0 0 0 0 0 0 0 0 0 NaN NaN NaN NaN NaN NaN
13 10046 10000 1 10317 2 10222 1 10346 2 0 0 0 0 NaN NaN NaN NaN NaN NaN
30 10131 10138 0 10009 2 10415 2 10001 2 0 0 0 0 NaN NaN NaN NaN NaN NaN
66 10180 10000 2 10032 2 10221 1 0 0 0 0 0 0 2.0 NaN NaN NaN NaN NaN
72 10188 10001 1 10002 1 0 0 0 0 0 0 0 0 NaN NaN NaN NaN NaN NaN