如何在Python/Pandas中基于表格行值进行查找匹配?
用Python/Pandas实现双维度匹配取值(对应Excel INDEX+MATCH逻辑)
需求说明
现有两个表格:
Table A
| state | value |
|---|---|
| A | 100 |
Table B
| state | 100 | 200 |
|---|---|---|
| A | 1 | 4 |
| B | 2 | 5 |
| C | 3 | 6 |
需要为Table A新增factor字段,从Table B中匹配对应state行和对应value列的值,最终得到如下结果:
目标结果
| state | value | factor |
|---|---|---|
| A | 100 | 1 |
在Excel中,对应的实现公式为:
INDEX('Table B'!B2:C4, MATCH('Table A'!A2, 'Table B'!A:A, 0), MATCH('Table A'!B2, 'Table B'!B1:C1, 0))
Pandas实现方法
方法一:转长格式后合并(通用易读)
先将宽格式的Table B转换为长格式,再通过merge按state和value双条件匹配:
import pandas as pd # 构造示例数据 df_a = pd.DataFrame({'state': ['A'], 'value': [100]}) df_b = pd.DataFrame({'state': ['A', 'B', 'C'], 100: [1,2,3], 200: [4,5,6]}) # 将Table B转为长格式:state、value、factor df_b_long = df_b.melt(id_vars='state', var_name='value', value_name='factor') # 统一value字段的数据类型(Table B的列名是字符串,需转为数值) df_b_long['value'] = df_b_long['value'].astype(int) # 双条件合并,获取匹配的factor值 result = df_a.merge(df_b_long, on=['state', 'value'], how='left') print(result)
方法二:使用lookup方法(高效直接)
利用lookup直接根据行标签和列标签提取对应值,适合已知行列匹配规则的场景:
import pandas as pd df_a = pd.DataFrame({'state': ['A'], 'value': [100]}) df_b = pd.DataFrame({'state': ['A', 'B', 'C'], 100: [1,2,3], 200: [4,5,6]}) # 将Table B的索引设为state,方便按行匹配 df_b_indexed = df_b.set_index('state') # 用lookup匹配行(state)和列(value转字符串) df_a['factor'] = df_b_indexed.lookup(df_a['state'], df_a['value'].astype(str)) print(df_a)
内容的提问来源于stack exchange,提问作者kshinforthewin
相关产品推荐
相关产品推荐

