【问题标题】:if value exist in dataframe add it to list如果数据框中存在值,则将其添加到列表中
【发布时间】:2019-08-20 22:20:45
【问题描述】:

我有两个数据框 F1 和 F2 都包含列 id1。

F1 包含两列 F1[id1,id2]
F2 包含三列 [id1,id2,Description] 我想测试 F2['id1'] 是否存在于 F1['id1'] 或 F2['id2']exists in F1['id2'] 然后我必须在 F1 中添加一个 colmun 并在 F2 中添加一个 id1 或 id2 的描述。 F1 和 F2 的内容是HERE。我参加 F1 的输出是 HERE 我像这样创建了 F1 和 F2

     F1 = {'id1': ['x22', 'x13','NaN','x421'],'id2':['NaN',223,788,'NaN']}
     F1 = pd.DataFrame(data=F1)
     F2 = {'id1': ['x22', 'NaN','NaN','x413','x421'],'id2':['NaN','223','788','NaN','233'],'Description':['California','LA','NY','Havnover','Munich']}
     F2 = pd.DataFrame(data=F2)

创建我的列表

     l1 =[]
     for id1 in F2['id1']:
        i=0
        for id11 in F1['id1']:
           i = i+1
           length = 4 #number of lines of DF1
           #print(id1)
           if (id1 == id11) & (i<=4): 
                 l1.append(F2['Description'])
           else: l1.append('Null')
      print(l1)

【问题讨论】:

    标签: python pandas list dataframe merge


    【解决方案1】:

    编辑: 由于问题改变

    我希望我能正确理解您修改后的问题。无论如何,您需要将 id1 上的 F1 和 F2 左合并,并继续将结果与 id2 上的 F2 左合并。之后您fillna 并删除“描述”列之一。

    假设你的 F1 和 F2 如下:

    In [362]: F1
    Out[362]:
       id1  id2
    0    1    4
    1    7    2
    2    9    1
    3    3    9
    4   10    7
    
    In [363]: F2
    Out[363]:
      Description  id1  id2
    0         One    1    3
    1         Two    2    7
    2       Three    3    3    
    

    id1左合并

    In [365]: F1_id1 = F1.merge(F2[['Description', 'id1']], on=['id1'], how='left')
     ...:
    
    In [366]: F1_id1
    Out[366]:
       id1  id2 Description
    0    1    4         One
    1    7    2         NaN
    2    9    1         NaN
    3    3    9       Three
    4   10    7         NaN    
    

    id2 上继续向左F1_id1

    In [367]: F1_id2 = F1_id1.merge(F2[['Description', 'id2']], on=['id2'], how='le
     ...: ft')
    
    In [368]: F1_id2
    Out[368]:
       id1  id2 Description_x Description_y
    0    1    4           One           NaN
    1    7    2           NaN           NaN
    2    9    1           NaN           NaN
    3    3    9         Three           NaN
    4   10    7           NaN           Two    
    

    最后,fillna 和删除Description_y

    In [372]: F1_id2['Description_x'] = F1_id2['Description_x'].fillna(F1_id2['Desc
     ...: ription_y'])
    
    In [373]: F1_id2.drop(['Description_y'], 1)
    Out[373]:
       id1  id2 Description_x
    0    1    4           One
    1    7    2           NaN
    2    9    1           NaN
    3    3    9         Three
    4   10    7           Two    
    

    【讨论】:

    • 谢谢你,andy.. 我已经编辑了我的帖子,你可以看看吗
    • 最初 F1 包含 id1、id2 和 F2 包含 id1、id2、Description。我必须分别在 F1['id1'] 和 F1['id2'] 中搜索 F2['id1'] 或 F1['id2'] 。我只为 id1 发布,因为我认为使用列表执行此操作时相同。也许我错了 。您有什么想法如何在两个字段(id1,id2)同时进行。再次感谢您
    • 我根据我对您修改后问题的理解更改了答案
    • 感谢您的帮助,我试过它并没有给出我想在我的 F1 上获得的结果。我已经编辑了我的帖子以放置我的文件的图片。抱歉,我们有很大的时差,所以我不能准时回答。
    • 所以,如果我理解正确,第一张图片是您的示例数据,第二张图片是您期望/希望看到的输出结果?
    【解决方案2】:

    不需要for 循环;使用merge:

    F2.merge(F1, left_on='id1', right_on='id1', how='left')
    

    【讨论】:

    • 感谢您的回复.. 但基本上我有 id1 和 id2。我必须对两列做同样的事情。如果 F2.id2 存在于 F1.id2 中或 F2.id1 存在于 F1.id1 中,我返回与此 id 相关的描述...这就是为什么我想一步一步做并使用列表..
    • @This 在您的问题中,您说 F1 只有一列,'id1'。是哪个?
    • 再次感谢您的回复.. 但最初 F1 包含 id1、id2 和 2 包含 id1、id2、Description。我必须分别在 F1['id1'] 和 F1['id2'] 中搜索 F2['id1'] 或 F1['id2'] 。我只为 id1 发布,因为我认为使用列表执行此操作时相同。也许我错了。你有什么想法如何在两个字段(id1,id2) 的同时进行。再次感谢您
    • @This 然后,请编辑您的问题以准确说明您的问题是什么。
    猜你喜欢
    • 2017-06-23
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多