根据其他数据框中的列映射数据框

时间:2016-09-08 12:13:55

标签: python pandas numpy indexing merge

我有两个DataFrames。一个看起来像这样:

df1.head()
#CHR    Start   End Name
chr1    141474  173862  SAP
chr1    745489  753092  ARB
chr1    762988  794826  SAS
chr1    1634175 1669127 ETH
chr1    2281853 2284259 BRB

第二个DataFrame如下所示:

df2.head()
#chr    start   end
chr1    141477  173860
chr1    745500  753000
chr16   56228385    56229180
chr11   101785507   101786117
chr7    101961796   101962267

我希望映射两个DataFrames的前三列,并创建一个新的DataFramedf3。例如,如果#chrdf1中的df2相等,那么请查找df2.start >= df1.startdf2.end <= df1.end

如果是这种情况,请按以下方式打印出来:

df3.head()

#chr    start   end Name
chr1    141477  173860  SAP
chr1    745500  753000  ARB

到目前为止,我已尝试创建一个执行此操作的函数:

def start_smaller_than_end(df1,df2):
    if df1.CHR == df2.CHR:
        df2.start >= df1.Start
        df2.End <= df2.End

    return df3

然而,当我运行它时,我收到以下错误:

df3(df1, df2)
name 'df3' is not defined

非常感谢任何建议和帮助。

1 个答案:

答案 0 :(得分:1)

我认为您可以merge使用boolean indexing

df = pd.merge(df1, df2, how='outer', left_on='#CHR', right_on='#chr')

df = df[(df.start >= df.Start) & (df.end <= df.End)]
df = df[['#chr','start','end','Name']]
print (df)
   #chr   start     end Name
0  chr1  141477  173860  SAP
3  chr1  745500  753000  ARB

通过评论编辑:

功能start_smaller_than_end

def start_smaller_than_end(df1,df2):
    df = pd.merge(df1, df2, how='outer', left_on='#CHR', right_on='#chr')
    df = df[(df.start >= df.Start) & (df.end <= df.End)]
    df = df[['#chr','start','end','Name']]
    return df

df3 = start_smaller_than_end(df1,df2)
print (df3)