根据其他列内容(相反方向值)使用列名称合并(添加)pandas 列数据

问题描述 投票:0回答:1

我有一个 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
X
ln
,但方向相反(例如:
l1no  
=
atNode 
,
atNode 
=
l1no
) 我的意思是:对于第一行,我想要
l1op 
= 2(来自第 66 行),
l2op 
= 1(来自第 13 行),等等...

我想这里的主要问题是制作一个地图(掩码?)什么索引包括l

X
no列中的atNode值,然后找到lYno的哪一列有
atNode
(来自lXno) ,然后...使用 lYln 作为 lXop .

我可能可以制作 6 个循环(每个节点最多 6 个链接)并逐列合并数据,但是(这会很慢并且)我认为有更多“Pythonic”方法可以做到这一点,我正在考虑使用

map
mask
where
...但我的经验还不够,无法以这种方式工作。

有什么想法吗?

python pandas merge where-clause mask
1个回答
0
投票

对于每个

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
© www.soinside.com 2019 - 2024. All rights reserved.