如果数据框中存在值,则将其添加到列表中

时间:2019-03-29 23:06:58

标签: python pandas list dataframe merge

我有两个包含ID1列的数据帧F1和F2。

F1包含两列F1[id1,id2]
F2包含三列[id1,id2,Description] 我想测试F2['id1']是否存在于F1['id1']或F2 ['id2'] exists in F1 ['id2']中,那么我必须在F1中添加带有此id1或id2描述的colmun在F2`中。 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)

2 个答案:

答案 0 :(得分:0)

不需要for循环;使用merge

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

答案 1 :(得分:0)

编辑: 由于有问题而更改

希望我能正确理解您修改后的问题。无论如何,您需要将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    

F1_id1上向左id2继续

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