如何基于两个已有Pandas DataFrame生成符合特定条件的新DataFrame
解决方法:基于Pandas生成门店-区域组合的扩展DataFrame
这个需求在零售数据整合里挺常见的,我之前做类似业务时也碰到过。核心思路是把All Zones的行单独拆分出来做全量扩展,再和特定区域的匹配结果合并,用Pandas的内置方法就能轻松实现。下面一步步来:
1. 先明确数据结构(示例)
先假设你的DataFrame结构如下(如果实际列名/结构不同,调整对应字段即可):
import pandas as pd # DF_1:存储SKU、价格、区域信息 DF_1 = pd.DataFrame({ 'SKU': ['A100', 'B200', 'C300'], 'Price': [10.99, 24.99, 15.50], 'Zone': ['North', 'All Zones', 'South'] }) # DF_2:存储门店ID、区域信息 DF_2 = pd.DataFrame({ 'Store_ID': ['S01', 'S02', 'S03', 'S04'], 'Zone': ['North', 'North', 'South', 'East'] })
2. 拆分并处理两类数据
我们把DF_1分成**"All Zones"行和特定区域行**分别处理:
- 对于
All Zones的行:需要和DF_2的所有门店-区域组合做全匹配(笛卡尔积) - 对于特定区域的行:只和DF_2中对应区域的门店匹配
代码实现
# 1. 拆分DF_1为两个子集 df_all_zones = DF_1[DF_1['Zone'] == 'All Zones'].drop(columns='Zone') # 去掉原Zone列,准备替换为DF_2的所有Zone df_specific_zones = DF_1[DF_1['Zone'] != 'All Zones'] # 2. 处理"All Zones"的行:生成所有门店-区域组合 df_all_expanded = df_all_zones.merge(DF_2, how='cross') # cross连接实现笛卡尔积 # 3. 处理特定区域的行:按Zone匹配门店 df_specific_matched = df_specific_zones.merge(DF_2, on='Zone', how='inner') # 4. 合并两个结果,得到最终的DF_3 DF_3 = pd.concat([df_all_expanded, df_specific_matched], ignore_index=True)
3. 结果说明
运行后DF_3会包含:
- SKU B200(原Zone为All Zones)和DF_2中4个门店的所有组合
- SKU A100(原Zone为North)和DF_2中North区域的2个门店组合
- SKU C300(原Zone为South)和DF_2中South区域的1个门店组合
注意事项
- 如果DF_1中有多个
All Zones的SKU,merge(how='cross')会自动为每个SKU生成所有门店组合 - 如果需要保留DF_1中没有匹配到门店的区域行,可以把
how='inner'改成how='left' - 如果DF_2中有重复的门店-区域记录,结果中也会保留这些重复项(符合业务逻辑的话无需额外处理)
内容的提问来源于stack exchange,提问作者Ty Swenson
相关产品推荐
相关产品推荐

