根据其他数据框的列映射数据框
Posted
技术标签:
【中文标题】根据其他数据框的列映射数据框【英文标题】:Mapping a dataframe based on the columns from other dataframe 【发布时间】:2017-01-16 08:48:49 【问题描述】:我有两个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
。例如,如果df1
和df2
中的#chr
相等,则查找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
非常感谢任何建议和帮助。
【问题讨论】:
检查这个问题:***.com/questions/30627968/… 【参考方案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)
【讨论】:
谢谢,但是两个数据帧的长度不同,所以抛出这个错误,ValueError: Series lengths must match to compare 是的,但您需要先将其合并并在merged
数据帧df
中进行比较。合并后还有问题吗?
对不起,我没有尝试合并 df ,我明白了,它现在正在工作。非常感谢..!!!
有没有办法让它成为我上面定义的函数?
好的,请稍等。以上是关于根据其他数据框的列映射数据框的主要内容,如果未能解决你的问题,请参考以下文章
根据 R 中的列名创建一个新数据框,其中包含来自另一个数据框的列