首页 > 解决方案 > 标记季节的最后一天

问题描述

我的数据集有问题,我想标记本季的最后一天(折扣,不是折扣),但我完全没有想法。标记应该是一个新变量(值 - 最后一天,标准日)

data = {
    'start_day': [
        '2008-01-01',
        '2008-01-02',
        '2008-01-03',
        '2008-01-04', 
        '2008-01-05'
    ],
    'start_day_no': [
        1,
        2, 
        3,
        4, 
        5
    ],
    'Season': [
        'Discount',
        'Discount', 
        'No_discount', 
        'No_discount', 
        'Discount'
    ],        
}
frame = pd.DataFrame(data)

因此,如果我查看我的完整数据集,我想标记折扣季的最后一天(蓝色)和标准价格的最后一天(红色),但条件是该季节至少持续 20 天(所以红色开始2016 年不算作一个赛季)。

在此处输入图像描述

请问有什么提示吗?谢谢!!!!

标签: pythonpandasnumpy

解决方案


您可以按照以下步骤进行操作:

在年份的模拟数据上创建:

df = pd.DataFrame({'Season':['No_discount']*16+
                            ['Discount']*90+
                            ['No_discount']*202+
                            ['Discount']*25+
                            ['No_discount']*33}, 
                  index=pd.date_range('2016-01-01','2016-12-31', freq='D'))

df['grp'] = (df['Season'] != df['Season'].shift()).cumsum()

df['grp_size'] = df.groupby('grp').transform('count')

df.groupby('grp').tail(1).query('grp_size >= 20') #Filtering groups smaller than 20

输出:

                 Season  grp  grp_size
2016-04-15     Discount    2        90
2016-11-03  No_discount    3       202
2016-11-28     Discount    4        25
2016-12-31  No_discount    5        33

其中数据框的索引是每组的最后日期。

df_out = df.groupby('grp').tail(1).query('grp_size >= 20')
df_out.index.strftime('%Y-%m-%d').tolist()

输出:

['2016-04-15', '2016-11-03', '2016-11-28', '2016-12-31']

推荐阅读