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

如何高效合并DataFrame中商品发布日前的预售销量数据?

Efficiently Merge Pre-Sales Data for Each Product in Pandas

Great question! Manually looping through DataFrames can get really slow as your dataset grows, so let's leverage pandas' optimized vectorized operations and grouping to handle this pre-sales merge cleanly and efficiently.

First, let's make sure our date columns are properly parsed as datetime objects (this is critical for comparing dates accurately):

import pandas as pd
from io import StringIO

# Load the input data
data = StringIO("""TitleCode,ReleaseDate,WeekEnding,TotalUnits
A,12/16/2017,12/2/2017 0:00,5
A,12/16/2017,12/9/2017 0:00,10
A,12/16/2017,12/16/2017 0:00,2
A,12/16/2017,12/23/2017 0:00,5
A,12/16/2017,12/30/2017 0:00,4
B,1/6/2018,1/13/2017 0:00,4
B,1/6/2018,1/20/2017 0:00,2
""")

# Parse date columns explicitly
datadf = pd.read_csv(data, parse_dates=['ReleaseDate', 'WeekEnding'])

Method 1: Groupby with Custom Function (Readable & Straightforward)

This approach groups data by each product (TitleCode), calculates pre-sales totals for each group, updates the release week's sales, and filters out pre-release rows:

def merge_pre_sales(group):
    # Get the fixed release date for the product (assumes 1 release date per TitleCode)
    release_date = group['ReleaseDate'].iloc[0]
    # Calculate total pre-sales (all weeks before release)
    pre_sales_total = group[group['WeekEnding'] < release_date]['TotalUnits'].sum()
    # Add pre-sales to the release week's total units
    group.loc[group['WeekEnding'] == release_date, 'TotalUnits'] += pre_sales_total
    # Keep only weeks from release date onward
    return group[group['WeekEnding'] >= release_date]

# Apply the function to each product group
resultdf = datadf.groupby('TitleCode', group_keys=False).apply(merge_pre_sales).reset_index(drop=True)

Method 2: Vectorized Merge & Update (Even Faster for Large Datasets)

If you're working with a very large dataset, this fully vectorized approach avoids apply() and uses pandas' merge/filter operations (which are optimized for speed):

# Calculate total pre-sales per product
pre_sales_totals = datadf[datadf['WeekEnding'] < datadf['ReleaseDate']]\
    .groupby('TitleCode')['TotalUnits'].sum()\
    .rename('PreSalesTotal')

# Merge pre-sales totals back to the original data
datadf_with_pre = datadf.merge(pre_sales_totals, on='TitleCode', how='left')
# Fill 0 for products with no pre-sales
datadf_with_pre['PreSalesTotal'] = datadf_with_pre['PreSalesTotal'].fillna(0)

# Update the release week's sales with pre-sales totals
datadf_with_pre.loc[
    datadf_with_pre['WeekEnding'] == datadf_with_pre['ReleaseDate'],
    'TotalUnits'
] += datadf_with_pre['PreSalesTotal']

# Filter out pre-release rows and clean up
resultdf = datadf_with_pre[datadf_with_pre['WeekEnding'] >= datadf_with_pre['ReleaseDate']]\
    .drop('PreSalesTotal', axis=1)\
    .reset_index(drop=True)

Verify the Result

Running either method will give you the desired output matching your resultdf:

TitleCode ReleaseDate          WeekEnding  TotalUnits
0         A  2017-12-16 2017-12-16 00:00:00          17
1         A  2017-12-16 2017-12-23 00:00:00           5
2         A  2017-12-16 2017-12-30 00:00:00           4
3         B  2018-01-06 2017-01-13 00:00:00           4
4         B  2018-01-06 2017-01-20 00:00:00           2

Both methods are way more efficient than manual loops because they use pandas' internal optimized operations (written in C under the hood) instead of Python-level row-by-row iteration.

内容的提问来源于stack exchange,提问作者M Arroyo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:08:32