我有一个数据帧df
Col1 Col2
A B
C A
B D
E F
G D
G H
K J
和一系列的ID
ID
A
F
我想要的是,对于id
中的所有字母,选择与最多2个中间产物有任何链接的其他字母。
让我们为A
做一个例子(这个例子更容易理解):
有两行,包括A
,链接到B
和C
,因此到A的直接链接是[B, C]
。(无论A在Col1
或Col2
中)
A B
C A
但是B
也链接到D
,并且D
链接到G
:
B D
G D
因此A
的链接是[B, C, D, G]
。
即使G
和H
是链接的,它也会从A
(A > B > D > G > H
生成B
、D
和G
作为中间产物),所以我不在A
链接列表中包含H
G H
我正在寻找一种方法来搜索链接列表id
中的所有ID,并将其保存在id
:
ID LinksList
A [B, C, D, G]
F [E]
我不介意LinksList
的类型(可以是字符串),因为我可以获得特定ID的信息并使用它。我也不介意ID在LinksList
中的顺序,只要它是完整的
我已经找到了解决这个问题的方法,但是使用了3for
循环,所以需要很长时间。
(对于ID中的k1,对于k2范围(0,3),为LinksList+起始元素的每个元素选择直接链接,如果它们还没有在LinksList中,则将它们放在LinksList中)。
有人能帮我只和熊猫一起做吗?
提前多谢
编辑:这是卡尔评论后的“3个循环”:
i = 0
for k in id:
linklist = list(df[df['Col1'] == k]['Col2']) + list(df[df['Col2'] == k]['Col1'])
new = df.copy()
intermediate_count = 1
while(len(new) > 0 and intermediate_count <= 2):
nn = new.copy()
new = []
for n in nn:
toadd = list(df[df['Col1'] == n]['Col2']) + list(df[df['Col2'] == n]['Col1'])
toadd = list(set(toadd).difference(df))
df = df + toadd
new = new + toadd
if(i==0):
d = {'Id': k, 'Linked': linklist}
df_result = pd.DataFrame(data=d)
i = 1
else:
d = {'Id': k, 'Linked': linklist}
df_result.append(pd.DataFrame(data=d))
我将首先附加数据帧的倒数,以便能够始终从Col1到Col2。然后,我将使用merges计算可能的结果,包括1和2个中间步骤。最后,我将把所有这些值聚合到集合中。代码可以是:
根据样本数据,它给出了预期的结果:
我们可以使用Networkx库:
输出:
打印图形表示:
相关问题 更多 >
编程相关推荐