基于多条件VLOOKUP在另一变量中生成新变量的实现方法
解决方案:基于SKU和Subcategory生成匹配价格列
我来帮你落地这个需求,下面分Python Pandas和SQL两种常用数据处理场景给出具体解法,完全匹配你描述的逻辑:
核心逻辑梳理
- 为
sku中的每个唯一值创建一个新变量(列),列名格式参考eta{subc},{sku}(比如你提到的eta2,3就代表sku#3、subc2) - 对每一行观测值,只要它的
subc和新变量对应sku的subc一致,就填充该行在门店/周维度下的自有产品价格own_price;不匹配则留空
解法1:Python Pandas实现
假设你的数据集是Pandas DataFrame,包含sku、subc、store、week、own_price这些核心列,代码如下:
import pandas as pd # 1. 构建「唯一sku -> 对应subc」的映射字典,避免重复计算 sku_subc_mapping = df.drop_duplicates(subset='sku').set_index('sku')['subc'].to_dict() # 2. 遍历每个唯一sku,生成对应新列并填充价格 for target_sku, target_subc in sku_subc_mapping.items(): # 按照规则生成列名:eta{subc},{sku} new_col_name = f'eta{target_subc},{target_sku}' # 条件判断:当前行subc等于目标sku的subc时,填充own_price,否则为缺失值 df[new_col_name] = df.apply( lambda row: row['own_price'] if row['subc'] == target_subc else pd.NA, axis=1 )
代码说明
- 第一步先对
sku去重,确保每个sku只绑定一个subcategory(如果存在一个sku对应多个subc的异常情况,建议先清洗数据) - 遍历过程中,每个新列会自动匹配所有同subc的观测值,填充对应的
own_price——就像你例子里的eta2,3列,第3-5行因为subc都是2,所以都会填充各自的own_price(如果门店/周维度下价格一致,取值自然相同)
解法2:SQL实现
如果数据存储在数据库中,这里以标准SQL为例,用CASE WHEN实现匹配逻辑(批量生成所有sku列需要结合数据库特性,先给出单sku示例,多sku可扩展为动态SQL):
-- 先获取所有唯一sku和对应的subcategory WITH unique_sku_subc AS ( SELECT DISTINCT sku, subc FROM product_data ) -- 主查询:生成目标列并填充价格 SELECT pd.*, -- 生成eta2,3列(对应sku=3、subc=2) CASE WHEN pd.subc = us.subc THEN pd.own_price ELSE NULL END AS `eta2,3` -- 若要生成更多sku的列,复制上面的CASE WHEN并替换us.sku的取值即可 FROM product_data pd -- 关联唯一sku-subc映射表 CROSS JOIN unique_sku_subc us WHERE us.sku = 3 -- 指定要生成列的sku GROUP BY pd.sku, pd.subc, pd.store, pd.week, pd.own_price, us.sku, us.subc;
扩展说明
如果需要批量生成所有sku对应的列,可以用动态SQL拼接CASE WHEN语句:比如MySQL用GROUP_CONCAT、PostgreSQL用STRING_AGG生成拼接字符串,再执行动态SQL,具体语法可根据你使用的数据库调整。
内容的提问来源于stack exchange,提问作者Olga
相关产品推荐
相关产品推荐

