You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态处理两个DataFrame:实现销售额置零与营收计算

解决方案

通过动态匹配产品列 + 广播日期比较可以实现无需手动修改代码的自动化处理,完美适配任意数量的产品,具体实现如下:

核心思路

  1. 将产品信息表(df2)以产品名为索引,方便通过列名快速匹配对应价格和开售日期
  2. 自动识别销量表(df1)中的所有产品列,无需硬编码列范围或列名
  3. 利用广播机制批量比较日期与开售时间,生成掩码后将不符合条件的营收置零
  4. 合并结果表,保留原始非业务列

完整可运行代码

import pandas as pd

# 示例数据
df1 = pd.DataFrame(data={
    'Date': pd.Series(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05'], dtype='datetime64[ns]'),
    'ColA': ['Apple', 'Banana', 'Orange', 'Blueberry', 'Watermelon'],
    'ColB': ['Cat', 'Dog', 'Pig', 'Rat', 'Bird'],
    'x1': [703, 540, 444, 969, 426],
    'x2': [750, 908, 835, 582, 950],
    'x3': [273, 397, 258, 393, 321],
    'x4': [738, 726, 986, 911, 337]
})

df2 = pd.DataFrame(data={
    'Product': ['x1', 'x2', 'x3', 'x4'],
    'Start_Date': pd.Series(['2022-01-02', '2022-01-04', '2022-01-04', '2022-01-05'], dtype='datetime64[ns]'),
    'Price': [0.9, 0.5, 1.2, 1.0]
})

# 1. 预处理产品信息表,以产品名为索引
df2 = df2.set_index('Product')

# 2. 自动识别所有产品列(此处假设列名以x开头,可根据实际规则调整)
product_cols = [col for col in df1.columns if col.startswith('x')]

# 3. 生成日期掩码:标记日期早于对应产品开售时间的位置
# 利用广播将一维日期数组转为二维,与产品开售日期数组逐元素比较
mask = df1['Date'].values[:, None] < df2.loc[product_cols, 'Start_Date'].values

# 4. 计算预测营收:销量 × 价格,再将掩码为True的位置置零
revenue = df1[product_cols].multiply(df2.loc[product_cols, 'Price'].values, axis='columns')
revenue[mask] = 0

# 5. 合并原始非业务列与计算结果
result = pd.concat([df1[['Date', 'ColA', 'ColB']], revenue], axis=1)
print(result)

关键细节说明

  • 动态列识别:通过列表推导式自动筛选产品列,替代原代码中硬编码的iloc[:,3:7],产品数量增减时自动适配
  • 广播比较:无需手动创建sd1/sd2等变量,利用numpy广播特性一次性完成所有日期与开售时间的比较,生成与营收表同形状的布尔掩码
  • 无硬编码依赖:所有匹配逻辑基于产品列名与df2的索引关联,新增或删除产品时无需修改代码

内容的提问来源于stack exchange,提问作者Bobby Heyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:27:30