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

Tre*_*ney 4 python vlookup pandas pandas-groupby

鉴于以下数据帧

  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
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)

想要的结果

  • 下表是用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)
Run Code Online (Sandbox Code Playgroud)

研究

Sco*_*ton 5

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

ul.set_index(['UpperGroup', 'LowerGroup'])['Time'].unstack().reindex(index=jg['Group'], columns=jg['Group'])
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

更进一步:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)