如何在Python Pandas DataFrame中按周统计各国代码的购买次数?
问题描述
我正在使用Python分析销售数据集,该数据集包含交易日期和购买对应的国家代码两列,由两个列名不同的小数据集合并而来,代码如下:
frames_f, frames_l = get_sales_frames(True) sales_f = frames_f[['Transaction Date', 'Buyer Country']] sales_l = frames_l[['Order Charged Date', 'Country of Buyer']] sales_l.columns = sales_f.columns sales = pd.concat([sales_f, sales_l]) sales['Transaction Date'] = pd.to_datetime(sales['Transaction Date'], infer_datetime_format=True)
数据集包含7个月的每日购买数据,我需要统计每周每个国家的购买次数。目前已实现按天统计的功能,代码及输出如下:
sales['Purchases'] = 1 purchases = sales.groupby(['Transaction Date', 'Buyer Country'])['Purchases'].sum() print(purchases)
输出:
Transaction Date Buyer Country 2021-06-01 US 2 2021-06-02 GB 1 IL 1 SE 1 US 7 .. 2021-12-29 US 7 2021-12-30 CA 1 US 4 2021-12-31 GB 1 US 7
但我需要将统计维度从每日改为每周,希望输出格式与上述类似,仅按周聚合各国购买次数。曾尝试使用df.groupby(pd.Grouper(key='Transaction Date', freq="W")).count(),但该方法仅统计每周总购买量,未按国家分组。请问最有效的实现方法是什么?
解决方案
只需在groupby中同时传入按周聚合的日期分组器和**Buyer Country列**,即可实现每周+国家的双重分组统计,输出格式与日统计完全一致。
核心代码
sales['Purchases'] = 1 # 按周+国家分组统计购买次数 weekly_purchases = sales.groupby( [pd.Grouper(key='Transaction Date', freq='W'), 'Buyer Country'] )['Purchases'].sum() print(weekly_purchases)
补充说明
pd.Grouper(key='Transaction Date', freq='W')默认以周日作为每周的结束日期,若需调整周结束日,可修改freq参数:比如'W-MON'代表周一为周结束日,'W-FRI'代表周五,以此类推。- 若你希望周标签显示为每周的起始日期而非结束日期,可以使用
freq='W-MON'结合label='left'参数,例如:
weekly_purchases = sales.groupby( [pd.Grouper(key='Transaction Date', freq='W-MON', label='left'), 'Buyer Country'] )['Purchases'].sum()
内容的提问来源于stack exchange,提问作者Dinkleberg
相关产品推荐
相关产品推荐

