如何使用 pandas 实现 vlookup 交叉引用
How to implement vlookup cross referencing with pandas
给定以下数据帧
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
想要的结果
- 下面的table是用Excel
vlookup
产生的
- 颜色仅供参考
- DataFrame 结果中不需要灰色填充区域
- 我正在尝试创建一个 DataFrame / Table,其中来自
jg
的 'Job'
数字是列和索引。
- 列中
'Job'
数字的 'Group'
值应用于从 ul
引用 'UpperGroup'
- 索引中
'Job'
数字的 'Group'
值应用于从 ul
引用 'LowerGroup'
- 值是
'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 site:whosebug.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
给定以下数据帧
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
想要的结果
- 下面的table是用Excel
vlookup
产生的
- 颜色仅供参考
- DataFrame 结果中不需要灰色填充区域
- 我正在尝试创建一个 DataFrame / Table,其中来自
jg
的'Job'
数字是列和索引。- 列中
'Job'
数字的'Group'
值应用于从ul
引用 - 索引中
'Job'
数字的'Group'
值应用于从ul
引用
'UpperGroup'
'LowerGroup'
- 列中
- 值是
'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 site:whosebug.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