如何使用pandas实现vlookup交叉引用

鉴于以下数据帧

  1. jg
 Job  Group
   1  116.0
   2  116.0
   3  116.0
   4  116.0
   5  116.0
   6  116.0
   7  124.0
   8  124.0
   9   74.0
  10   74.0
  11   74.0
  12  126.0
  13  126.0
  1. ul
 UpperGroup  LowerGroup  Time
        116         116     5
        116         124    15
        116          74    15
        116         126    15
        124         116    15
        124         124     5
        124          74    15
        124         126    15
         74         116    15
         74         124    15
         74          74     5
         74         126    15
        126         116    15
        126         124    15
        126          74    15
        126         126     5

想要的结果

  • 下表是用Excel制作的 vlookup
  1. 颜色仅供参考
    • DataFrame 结果中不需要灰色填充区域
  2. 我正在尝试创建一个 DataFrame / Table,其中的'Job'数字jg是列和索引。
    • 'Group'该值'Job'中的列数,应使用参考'UpperGroup'ul
    • 'Group'该值'Job'中的索引号,应使用参考'LowerGroup'ul
  3. 'Time'来自ul对应于'UpperGroup''LowerGroup'
    • 'UpperGroup'= 116 和'LowerGroup'= 224,映射到'Time'= 15

可重现的数据帧

import pandas as pd

ul_data = {'UpperGroup': [116, 116, 116, 116, 124, 124, 124, 124, 74, 74, 74, 74, 126, 126, 126, 126],
           'LowerGroup': [116, 124, 74, 126, 116, 124, 74, 126, 116, 124, 74, 126, 116, 124, 74, 126],
           'Time': [5, 15, 15, 15, 15, 5, 15, 15, 15, 15, 5, 15, 15, 15, 15, 5]}
ul = pd.DataFrame(ul_data)

jg_data = {'Job': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
           'Group': [116.0, 116.0, 116.0, 116.0, 116.0, 116.0, 124.0, 124.0, 74.0, 74.0, 74.0, 126.0, 126.0]}
jg = pd.DataFrame(jg_data)

研究

  • 我已经回顾了搜索中的几个问题,但它们似乎并不合适,我只是想不出一种方法来将它们整合在一起。
    1. Google - pandas vlookup 站点:stackoverflow.com
    2. 经过考虑的 merge/join
    3. 经过考虑的 map

回答

这是获得所需结果的一种方法。

ul.set_index(['UpperGroup', 'LowerGroup'])['Time'].unstack().reindex(index=jg['Group'], columns=jg['Group'])

输出:

Group  116.0  116.0  116.0  116.0  116.0  116.0  124.0  124.0  74.0   74.0   74.0   126.0  126.0
Group                                                                                           
116.0      5      5      5      5      5      5     15     15     15     15     15     15     15
116.0      5      5      5      5      5      5     15     15     15     15     15     15     15
116.0      5      5      5      5      5      5     15     15     15     15     15     15     15
116.0      5      5      5      5      5      5     15     15     15     15     15     15     15
116.0      5      5      5      5      5      5     15     15     15     15     15     15     15
116.0      5      5      5      5      5      5     15     15     15     15     15     15     15
124.0     15     15     15     15     15     15      5      5     15     15     15     15     15
124.0     15     15     15     15     15     15      5      5     15     15     15     15     15
74.0      15     15     15     15     15     15     15     15      5      5      5     15     15
74.0      15     15     15     15     15     15     15     15      5      5      5     15     15
74.0      15     15     15     15     15     15     15     15      5      5      5     15     15
126.0     15     15     15     15     15     15     15     15     15     15     15      5      5
126.0     15     15     15     15     15     15     15     15     15     15     15      5      5

更进一步:

ul.set_index(['UpperGroup', 'LowerGroup'])['Time']
  .unstack()
  .reindex(index=jg['Group'], columns=jg['Group'])
  .set_axis(pd.MultiIndex.from_frame(jg[['Group', 'Job']]))
  .set_axis(pd.MultiIndex.from_frame(jg[['Group', 'Job']]), axis=1)

输出:

Group     116.0                     124.0     74.0          126.0    
Job          1   2   3   4   5   6     7   8     9   10  11    12  13
Group Job                                                            
116.0 1       5   5   5   5   5   5    15  15    15  15  15    15  15
      2       5   5   5   5   5   5    15  15    15  15  15    15  15
      3       5   5   5   5   5   5    15  15    15  15  15    15  15
      4       5   5   5   5   5   5    15  15    15  15  15    15  15
      5       5   5   5   5   5   5    15  15    15  15  15    15  15
      6       5   5   5   5   5   5    15  15    15  15  15    15  15
124.0 7      15  15  15  15  15  15     5   5    15  15  15    15  15
      8      15  15  15  15  15  15     5   5    15  15  15    15  15
74.0  9      15  15  15  15  15  15    15  15     5   5   5    15  15
      10     15  15  15  15  15  15    15  15     5   5   5    15  15
      11     15  15  15  15  15  15    15  15     5   5   5    15  15
126.0 12     15  15  15  15  15  15    15  15    15  15  15     5   5
      13     15  15  15  15  15  15    15  15    15  15  15     5   5


以上是如何使用pandas实现vlookup交叉引用的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>