Pandas在多索引数据帧中计算连续事件

2024-06-25 06:16:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经为此工作了一段时间了,但似乎没法解决。我使用的是具有两个级别的多索引数据帧,如下所示:

def data():
    data = {'date': pd.Series(['2016-1-1', '2016-1-1', '2016-1-1', 
                               '2016-1-2', '2016-1-2', '2016-1-2', 
                               '2016-1-3', '2016-1-3', '2016-1-3',
                               '2016-1-4', '2016-1-4', '2016-1-4',
                               '2016-1-5', '2016-1-5', '2016-1-5']),
            'group': pd.Series(['groupA', 'groupB', 'groupC', 
                                'groupA', 'groupB', 'groupC', 
                                'groupA', 'groupB', 'groupC',
                                'groupA', 'groupB', 'groupC',
                                'groupA', 'groupB', 'groupC']),
            'series1': pd.Series([1, 2, 3, 
                                  1, 2, 3, 
                                  1, 2, 3,
                                  1, 3, 4,
                                  2, 3, 4]),
           'series2': pd.Series([1, 3, 4, 
                                 2, 3, 3, 
                                 2, 4, 2,
                                 1, 2, 3,
                                 1, 2, 3])}
    df = pd.DataFrame(data)
    df['date'] = pd.to_datetime(df['date'])
    df.set_index(['date', 'group'], inplace=True)
return df

我有一列指定了3个条件中的1个。可能有更简洁的方法来编写这部分代码,但这不是我的问题。在

^{pr2}$

我的问题是,我想添加一个列来计算每日连续条件的数量。我尝试了groupbycumcount的几种不同实现,我能够获得所有条件的累计计数,但我希望它们在日期索引不连续时重置。在

下面我列出了一些我尝试过的相关帖子。我原以为Pandas: conditional rolling count中的第二个答案会起作用,但是它使用了一个transform方法,因为我有多个列,所以在这里似乎不起作用。在

按照postFinding consecutive segments in a pandas data frame中概述的策略,我创建了下面的代码,它创建了一个SeriesSeries,其中包含日期和组索引值以及来自“result”列的数据。我想我可以把这个df切片,这样我就可以对每个连续的组进行计数,并将这些结果合并到原始df中。在

df1 = df.reset_index(level=['date','group']).groupby(['result']).apply(np.array)

输出应该是这样的。在

1
1
1
1
2
1
2
3
1
1
1
2
1
2
3

很难看出层次化df结构是否满足了累积连续条件,但如果我解开df,就更容易看到我要实现的目标。也许有一种方法可以使用unstack来确定数据的方向,从而得到我想要的结果?在

df['result'].groupby(['date','group']).head().unstack()

Out[9]: 
group        groupA   groupB   groupC
date                                 
2016-01-01    equal     less     less
2016-01-02     less     less    equal
2016-01-03     less     less  greater
2016-01-04    equal  greater  greater
2016-01-05  greater  greater  greater

Tags: 数据方法dfdatadategroup条件series