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

How to implement vlookup cross referencing with pandas

给定以下数据帧

  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

想要的结果

  1. 颜色仅供参考
    • DataFrame 结果中不需要灰色填充区域
  2. 我正在尝试创建一个 DataFrame / Table,其中来自 jg'Job' 数字是列和索引。
    • 列中 'Job' 数字的 'Group' 值应用于从 ul
    • 引用 'UpperGroup'
    • 索引中 'Job' 数字的 'Group' 值应用于从 ul
    • 引用 'LowerGroup'
  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)

研究

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

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