簡體   English   中英

如何從一列中查找也出現在 Python 中 DataFrame 的另一列中的元素

[英]How to find the elements from one column which also appear in another column of a DataFrame in Python

我已將以下玩具化學反應轉換為 DataFrame 以進行進一步的二分網絡表示:

R1: A + B -> C

R2: C + D -> E

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

現在,我想從中創建一個新的 DataFrame,僅表示基於它們的化合物的反應之間的關系,例如:在上面的 DataFrame 中, C是來自R1目標,而C也是R2,那么,關系應該:

R1->R2

(我可以為上面的Daframe獲得唯一的反應 - 反應關系)

我為此任務創建的代碼如下:

newData=[]
    for i in range(0,len(data["Target"].index.values)):
        for j in range(0,len(data["Source"].index.values)):  
            if data.iloc[i,1] == data.iloc[j,0] and not re.match("R.", 
            data.iloc[i,1], flags=0):
                newData.append(data.iloc[i,0] +"\t" + data.iloc[j,1])

但是,對於大表(數千行),代碼可以工作,它變得非常慢......我仍然是初學者,所以如果你能幫助我改進它,我會很高興。 謝謝=D

我更喜歡基於字典的方法:

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'}

您可以合並日期框上的數據框

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM