如何从一列中查找元素,这些元素也出现在Python的DataFrame的另一列中

时间:2018-02-28 18:48:55

标签: python pandas

我已将以下玩具化学反应转化为DataFrame以进一步进行二分网络表示:

R1: A + B -> C

R2: C + D -> E

SourceTarget
R1    C
A     R1
B     R1
R2    E
C     R2
D     R2

现在,我想从这个创建一个新的DataFrame,仅代表基于其化合物的反应之间的关系,例如: 在C以上的DataFrame中,来自R1目标C的{​​{1}}的来源,然后,关系应该是:

R2

(我可以为上面的Daframe获得的唯一反应 - 反应关系)

我为此任务创建的代码如下:

R1->R2

然而,代码适用于大表(数千行),它变得非常慢......我还是初学者,所以如果你能帮助我改进它,我会很高兴。谢谢= D

2 个答案:

答案 0 :(得分:1)

我的偏好是基于字典的方法:

import pandas as pd

d = df.set_index('Source')['Target']
r = {i for i in set(df['Source']).union(df['Target'])  if 'R' in i}

{k: d.get(d.get(k)) for k in r if d.get(d.get(k))}

# {'R1': 'R2'}

答案 1 :(得分:1)

您可以合并日期框架上的数据框

RtoC = df.merge(df,how='inner',left_on='Source',right_on='Target')\
                .drop(['Target_y','Source_x'],axis=1)\
                .rename(columns={'Target_x':'Target','Source_y':'Source'})

然后过滤化合物

RtoC[(RtoC.Target.str.contains('\d()')) & (RtoC.Source.str.contains('\d()'))]


  Target Source
4     R2     R1

或转换为字典,映射值并过滤

mapper = dict(df.values[::-1])

df.Target = df.Target.map(mapper)

df[(df.Target.str.contains('\d()')) & (df.Source.str.contains('\d()'))]

  Source Target
0     R1     R2