Python中基于STAGE匹配实现两表指定列相乘的for循环问题
问题:基于STAGE匹配两张表并计算衍生列
数据表
Table A
| NAME | STAGE | Quan | Products | A | B |
|---|---|---|---|---|---|
| XYD1234 | PROD | 4643 | A, C, T, Y | 1 | 0 |
| FGY4567 | TEST | 4739 | A, U, p, Y | 0 | 1 |
| YUD4568 | QUE | 45632 | I, Y, O, P | 0 | 1 |
| OKE4556 | STACK | 97474 | A, C, P, Y | 1 | 0 |
Table B
| STAGE | A | B |
|---|---|---|
| PROD | 10 | 5 |
| TEST | 20 | 10 |
| QUE | 30 | 15 |
| STACK | 49 | 25 |
需求
当Table A每行的STAGE与Table B的STAGE匹配时,将Table A的A列与Table B对应STAGE的A列相乘得到A_STAGE,同理Table A的B列与Table B对应STAGE的B列相乘得到B_STAGE,最终输出如下表格:
目标输出
| NAME | STAGE | Quan | Products | A | B | A_STAGE | B_STAGE |
|---|---|---|---|---|---|---|---|
| XYD1234 | PROD | 4643 | A, C, T, Y | 1 | 0 | 10 | 0 |
| FGY4567 | TEST | 4739 | A, U, p, Y | 0 | 1 | 0 | 10 |
| YUD4568 | QUE | 45632 | I, Y, O, P | 0 | 1 | 0 | 15 |
| OKE4556 | STACK | 97474 | A, C, P, Y | 1 | 0 | 49 | 0 |
现有代码问题排查
你写的for循环代码存在以下问题:
A.loc['Stage'] == B['Stage']:索引错误(应该按行索引i定位),且仅做了比较未使用结果,无法实现STAGE匹配逻辑A['A_Stage'] = A['A'] * B['A']:直接按行位置相乘,未基于STAGE匹配,计算逻辑完全错误- 循环整体逻辑混乱,没有针对每行找到Table B中对应STAGE的取值
解决方案
推荐方案:使用pandas向量化操作(高效简洁)
不需要循环,直接用merge匹配两张表后计算衍生列:
import pandas as pd # 假设A、B是已加载的DataFrame merged_df = pd.merge(A, B, on='STAGE', suffixes=('', '_b')) # 计算衍生列 merged_df['A_STAGE'] = merged_df['A'] * merged_df['A_b'] merged_df['B_STAGE'] = merged_df['B'] * merged_df['B_b'] # 保留目标输出列 result = merged_df[['NAME', 'STAGE', 'Quan', 'Products', 'A', 'B', 'A_STAGE', 'B_STAGE']] print(result)
备选方案:修改循环实现(不推荐,效率低)
如果一定要用循环,可通过字典快速匹配STAGE取值:
# 将Table B转为字典,便于快速查找 stage_map = B.set_index('STAGE').to_dict('index') # 初始化衍生列 A['A_STAGE'] = 0 A['B_STAGE'] = 0 for i in range(len(A)): current_stage = A.loc[i, 'STAGE'] # 获取当前STAGE对应的Table B取值 b_data = stage_map.get(current_stage, {}) # 计算并赋值 A.loc[i, 'A_STAGE'] = A.loc[i, 'A'] * b_data.get('A', 0) A.loc[i, 'B_STAGE'] = A.loc[i, 'B'] * b_data.get('B', 0) print(A)
内容的提问来源于stack exchange,提问作者08223003
相关产品推荐
相关产品推荐

