2014-11-06 82 views
1

假设我有一个熊猫df,其中夹着一段时间的指标行。防爆。在三明治指示符变量之间高效地分割熊猫DataFrame行

In [9]: pd.DataFrame({'col1':np.arange(1,11),'indicator':[0,1,0,0,0,1,0,0,1,1]}) 
Out[9]: 
    col1 indicator 
0  1   0 
1  2   1 
2  3   0 
3  4   0 
4  5   0 
5  6   1 
6  7   0 
7  8   0 
8  9   1 
9 10   1 

我想要做的是使用groupby来选择由指标分隔的分区。

ex。

组1

col1 indicator 
0  1   0 
1  2   1 

组2

2  3   0 
3  4   0 
4  5   0 
5  6   1 

组3

6  7   0 
7  8   0 
8  9   1 

4族

9 10   1 

天真的解决方案将只是将列指标列为列表,在其中运行for-loop并标记每个部分。但假设数据集非常大,并且您想避免for循环。在这里可以做些更聪明的事情,把不同的群体分开吗?

谢谢!

回答

2

只需指定另一个列的indicator一个cumsum,然后应用groupby,这应该做的伎俩:

# reverse the order as you have indicator at end of group, then reverse back 
df['grouped'] = df['indicator'].loc[::-1].cumsum().loc[::-1] 

for g in df.groupby('grouped', sort=False): 
    print g 
(4, col1 indicator grouped 
0  1   0  4 
1  2   1  4) 
(3, col1 indicator grouped 
2  3   0  3 
3  4   0  3 
4  5   0  3 
5  6   1  3) 
(2, col1 indicator grouped 
6  7   0  2 
7  8   0  2 
8  9   1  2) 
(1, col1 indicator grouped 
9 10   1  1) 
+0

哇哈哈!那是如此的美好和优雅!谢谢! – 2014-11-06 16:41:47

+0

很有帮助;) – Anzel 2014-11-06 16:47:34