如何使用pandas实现vlookup交叉引用
鉴于以下数据帧
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
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
- 颜色仅供参考
- DataFrame 结果中不需要灰色填充区域
- 我正在尝试创建一个 DataFrame / Table,其中的
'Job'数字jg是列和索引。- 在
'Group'该值'Job'中的列数,应使用参考'UpperGroup'从ul - 在
'Group'该值'Job'中的索引号,应使用参考'LowerGroup'从ul
- 在
- 值
'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)
研究
- 我已经回顾了搜索中的几个问题,但它们似乎并不合适,我只是想不出一种方法来将它们整合在一起。
- Google - pandas vlookup 站点:stackoverflow.com
- 经过考虑的
merge/join - 经过考虑的
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