我已经为此工作了一段时间了,但似乎没法解决。我使用的是具有两个级别的多索引数据帧,如下所示:
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}$我的问题是,我想添加一个列来计算每日连续条件的数量。我尝试了groupby
和cumcount
的几种不同实现,我能够获得所有条件的累计计数,但我希望它们在日期索引不连续时重置。在
下面我列出了一些我尝试过的相关帖子。我原以为Pandas: conditional rolling count中的第二个答案会起作用,但是它使用了一个transform
方法,因为我有多个列,所以在这里似乎不起作用。在
按照postFinding consecutive segments in a pandas data frame中概述的策略,我创建了下面的代码,它创建了一个Series
的Series
,其中包含日期和组索引值以及来自“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
让我们将此方法用于
groupby
和cumcount
:输出:
^{pr2}$相关问题 更多 >
编程相关推荐