首页 > 解决方案 > 在 pandas 中使用每周聚合过滤器

问题描述

所以我在熊猫每周跟踪蔬菜的美元销售额有下表

datetime     | vegetable | sales (amount sold)
2020-01-06.   carrot.     100
2020-01-13.   carrot.     200
2020-01-20.   carrot.     450
.
.
.
2020-03-23.   carrot.     250
2020-01-06.   onion.      40
2020-01-13.   onion.      80
2020-01-20.   onion.      10
.
.
.
2020-04-27.   onion.      60
2020-01-06.   lettuce     40
2020-01-13.   lettuce     0
2020-01-20.   lettuce.    0
2020-01-28.   lettuce.    0
.
.
.
2020-03-16.   lettuce     50

是否可以按蔬菜分组并在一个月(4 周)的时间窗口内过滤掉特定蔬菜在 1-2 周内售出 0 次的蔬菜。例如,生菜在 1 月份的 4 周中有 3 周没有售出,因此不应该进入决赛桌。我是否需要一个额外的列指示器月数或周数(或两者)用于过滤器,或者是否可以通过遍历蔬菜组中的 ds 并一次执行 4 个日期戳?

标签: pythonpandas

解决方案


尝试这个:

import pandas as pd

df = pd.DataFrame(
    data=[
        ['2020-01-06', 'carrot', 100],
        ['2020-01-13', 'carrot', 200],
        ['2020-01-20', 'carrot', 450],
        ['2020-03-23', 'carrot', 250],
        ['2020-01-06', 'onion', 40],
        ['2020-01-13', 'onion', 80],
        ['2020-01-20', 'onion', 10],
        ['2020-04-27', 'onion', 60],
        ['2020-01-06', 'lettuce', 40],
        ['2020-01-13', 'lettuce', 0],
        ['2020-01-20', 'lettuce', 0],
        ['2020-01-28', 'lettuce', 0],
        ['2020-03-16', 'lettuce', 50, ]],
    columns=['datetime', 'vegetable', 'sales']
)

df['datetime'] = pd.to_datetime(df.datetime)
df['datetime_month'] = df.datetime.map(lambda x: x.strftime('%Y-%m'))
df['has_sales'] = df.sales.apply(lambda x: 1 if x > 0 else 0)

month_df = df.groupby(
    ['datetime_month', 'vegetable']
).agg(n_weeks_w_sales=('has_sales', 'sum')).reset_index()

month_df = month_df[month_df.n_weeks_w_sales > 2]

df.merge(
    right=month_df,
    on=['datetime_month', 'vegetable'],
    how='inner'
).drop(columns=['has_sales', 'n_weeks_w_sales', 'datetime_month'])

推荐阅读