如何在SAS中基于另一数据集匹配primaryID与TypeID填充字段?
问题描述
我之前做过这个操作,按理说并不难……但现在完全想不起来该如何高效实现了。
我有两个数据集:
数据集1(Table 1)
| primaryID | TypeID |
|---|---|
| 1001 | A |
| 1001 | B |
| 1001 | C |
| 1002 | B |
| 1003 | C |
| 1004 | A |
| 1004 | C |
| 1005 | B |
数据集2(Table 2)
| primaryID | valueA | valueB | valueC |
|---|---|---|---|
| 1001 | 12 | 0.22 | 0.042 |
| 1002 | 10 | 0.19 | 0.039 |
| 1003 | 9 | 0.18 | 0.036 |
| 1004 | 14 | 0.3 | 0.062 |
| 1005 | 5 | 0.12 | 0.028 |
我需要在数据集1中新增一个字段(Value),取值为数据集2中匹配primaryID的行里与TypeID对应的值。
预期输出
| primaryID | TypeID | Value |
|---|---|---|
| 1001 | A | 12 |
| 1001 | B | 0.22 |
| 1001 | C | 0.042 |
| 1002 | B | 0.19 |
| 1003 | C | 0.036 |
| 1004 | A | 14 |
| 1004 | C | 0.062 |
| 1005 | B | 0.12 |
解决方案
方法1:SQL实现
通过JOIN关联两个表,结合CASE语句匹配TypeID对应的字段值:
SELECT t1.primaryID, t1.TypeID, CASE t1.TypeID WHEN 'A' THEN t2.valueA WHEN 'B' THEN t2.valueB WHEN 'C' THEN t2.valueC END AS Value FROM Table1 t1 JOIN Table2 t2 ON t1.primaryID = t2.primaryID;
如果TypeID类型较多,可改用动态SQL,但针对固定的A/B/C场景,上述语句高效且直接。
方法2:Python Pandas实现
基础实现(适合中小数据集)
先合并数据集,再通过apply提取对应字段值:
import pandas as pd # 构造示例数据(实际可直接读取数据源) table1 = pd.DataFrame({ 'primaryID': [1001,1001,1001,1002,1003,1004,1004,1005], 'TypeID': ['A','B','C','B','C','A','C','B'] }) table2 = pd.DataFrame({ 'primaryID': [1001,1002,1003,1004,1005], 'valueA': [12,10,9,14,5], 'valueB': [0.22,0.19,0.18,0.3,0.12], 'valueC': [0.042,0.039,0.036,0.062,0.028] }) # 按primaryID合并数据 merged = table1.merge(table2, on='primaryID', how='left') # 提取对应TypeID的Value merged['Value'] = merged.apply(lambda row: row[f'value{row["TypeID"]}'], axis=1) # 保留目标列 result = merged[['primaryID', 'TypeID', 'Value']] print(result)
优化实现(适合大数据集)
用np.select替代apply,提升运行效率:
import pandas as pd import numpy as np # 合并数据步骤同上 merged = table1.merge(table2, on='primaryID', how='left') # 定义匹配条件与对应取值 conditions = [ merged['TypeID'] == 'A', merged['TypeID'] == 'B', merged['TypeID'] == 'C' ] choices = [merged['valueA'], merged['valueB'], merged['valueC']] merged['Value'] = np.select(conditions, choices) result = merged[['primaryID', 'TypeID', 'Value']]
内容的提问来源于stack exchange,提问作者LR2008
相关产品推荐
相关产品推荐

