Python 在另一个数据帧中查找一个数据帧的值

Python 在另一个数据帧中查找一个数据帧的值,python,pandas,Python,Pandas,我有两个数据帧,我想做一个类似于excel中Vlookup的查找 df_orig.head() A 0 3 1 4 2 6 3 7 4 8 df_new Combined Length Group_name 0 [8, 9, 112, 114, 134, 135] 6 Group 1 1 [15, 16, 17, 18, 19, 20] 6 Gro

我有两个数据帧,我想做一个类似于excel中Vlookup的查找

df_orig.head()
   A  
0  3 
1  4  
2  6  
3  7  
4  8  


df_new
              Combined           Length  Group_name  
0   [8, 9, 112, 114, 134, 135]       6    Group 1   
1     [15, 16, 17, 18, 19, 20]       6    Group 2   
2         [15, 16, 17, 18, 19]       5    Group 3   
3         [16, 17, 18, 19, 20]       5    Group 4   
4             [15, 16, 17, 18]       4    Group 5   
5             [8, 9, 112, 114]       4    Group 6   
6                 [18, 19, 20]       3    Group 7   
7                 [28, 29, 30]       3    Group 8   
8                     [21, 22]       2    Group 9   
9                     [28, 29]       2   Group 10   
10                    [26, 27]       2   Group 11   
11                    [24, 25]       2   Group 12   
12                      [3, 4]       2   Group 13   
13                      [6, 7]       2   Group 14   
14                    [11, 14]       2   Group 15   
15                    [12, 13]       2   Group 16   
16                      [0, 1]       2   Group 17
如何将
df_new[“Group_name”]
中的值添加到
df_orig[“A”]

“组名称”
必须基于
df\u new[“Combined”]
中的
df\u orig[“A”]
中的值的查找

所以它看起来像:

df_orig.head()
   A  Looked_up
0  3  Group 13
1  4  Group 13 
2  6  Group 14 
3  7  Group 14 
4  8  Group 1

谢谢大家!

这里有一种方法可以模仿vlookup。下面是一个简单的例子

import pandas as pd

df_origin = pd.DataFrame({'A': [3, 11, 0, 12, 6]})

df_new = pd.DataFrame({'Combined': [[3, 4, 5], [6, 7], [11, 14, 20],
                                    [12, 13], [3, 1], [0, 4]],
                       'Group_name': ['Group 13', 'Group 14', 'Group 15',
                                      'Group 16', 'Group 17', 'Group 18']})

df_new['ID'] = list(zip(*df_new['Combined'].tolist()))[0]

df_origin['Group_name'] = df_origin['A'].map(df_new.drop_duplicates('ID')\
                                                   .set_index('ID')['Group_name'])
结果

    A Group_name
0   3   Group 13
1  11   Group 15
2   0   Group 18
3  12   Group 16
4   6   Group 14
解释

  • 通过
    zip
    提取
    df_new['Combined']
    中列表的第一个元素
  • 使用
    drop\u duplicates
    ,然后创建一系列映射
    ID
    Group\u name
  • 最后,使用
    pd.Series.map
    通过该系列将
    df_origin['A']
    映射到
    Group_name

    • 两步
      ***unest***
      +
      合并

      df=pd.DataFrame({'Combined':df.Combined.sum(),'Group_name':df['Group_name'].repeat(df.Length)})
      
      df_orig.merge(df.groupby('Combined').head(1).rename(columns={'Combined':'A'}))
      Out[77]: 
         A Group_name
      0  3   Group 13
      1  4   Group 13
      2  6   Group 14
      3  7   Group 14
      4  8    Group 1
      

      一些元素(例如
      8
      )出现在多个组中,然后会发生什么?更高的元素(更大的列表长度)更具包容性,它们是必须使用的元素…原因是当您查看dfu new中的第1、2、3行时,它们基本相同,除了第1行包含2和3中缺少的数字之外。Vlookup会在第一次发现匹配时停止,并给出正确答案。不幸的是,这是我认为可以使用的变通方法,而不是为了1而放弃第2行和第3行。谢谢JPP,有没有办法让这个解决方案也与“组合”列表中的其他数字匹配。就像使用df_origin=pd.DataFrame({'A':[4,5,7,13,0]})当然,要匹配第二个数字,请使用
      df_new['ID2']=list(zip(*df_new['Combined'].tolist())[1]
      和group by
      ID2