Pandas 在数据帧上使用VLookup函数

Pandas 在数据帧上使用VLookup函数,pandas,dataframe,merge,Pandas,Dataframe,Merge,我有两个数据帧l3,其中包含559行,前一天的帧'mains'包含58行,现在我想在l3中创建一列'new',这样,如果l3列'dum'中的值出现在mains数据帧中'Datecomb'列的任何一行中,那么新列应该包含True else False 我试过: def f(i): if((i == (mains['Datecomb']).any()) == True): return 'True' else: return 'False' l3[

我有两个数据帧l3,其中包含559行,前一天的帧'mains'包含58行,现在我想在l3中创建一列'new',这样,如果l3列'dum'中的值出现在mains数据帧中'Datecomb'列的任何一行中,那么新列应该包含True else False

我试过:

def f(i):
    if((i == (mains['Datecomb']).any()) == True):
        return 'True'
    else:
        return 'False'

 l3['new']=l3['dum'].apply(f)
但是这个函数只返回False
我对l3['dum']和mnains['Datecomb']都使用了值计数,并且我可以在chrome上使用Ctrl+F选项查看常见值…

对于您的特定请求,我们实际上可以通过一些方法链接和列表理解在一行中实现这一点:

I3['new'] = [mains['Datecomb'].where(mains['Datecomb'] == i).count() > 0 for i in I3['dum'].values]
此表达式使用列表理解来计算mains['Datecomb']中I3['dum']中每个值的条目数,如果该计数大于0,则返回True,并将结果列表设置为列I3['new']

如果您不熟悉列表理解,请在线查看一些示例。这是一个强大的工具

或者,您可以使用DataFrame.join方法连接干线上的值_counts>0操作的结果:

对于更一般的查找操作,使用join、merge或concat方法可能更好。我刚刚发现上面的第一种方法适合您的具体要求

我在下面的样本数据集上测试了这一点,两种方法都有效

I3 = pd.DataFrame([
     ['dum1', 'old1'],
     ['dum2', 'old2'],
     ['dum3', 'old3'],
     ['dum4', 'old4']],
     columns = ['dum', 'old'] )
mains = pd.DataFrame([
     ['dum2', 'not_used2'],
     ['dum3', 'not_used3'],
     ['dum3', 'not_used4']],
     columns = ['Datecomb', 'NotUsed'])

这回答了你的问题吗?
I3 = pd.DataFrame([
     ['dum1', 'old1'],
     ['dum2', 'old2'],
     ['dum3', 'old3'],
     ['dum4', 'old4']],
     columns = ['dum', 'old'] )
mains = pd.DataFrame([
     ['dum2', 'not_used2'],
     ['dum3', 'not_used3'],
     ['dum3', 'not_used4']],
     columns = ['Datecomb', 'NotUsed'])