我有两个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
的前三列,并创建一个新的DataFrame
,df3
。例如,如果#chr
和df1
中的df2
相等,那么请查找df2.start >= df1.start
和df2.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
非常感谢任何建议和帮助。
答案 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)