2014-11-06 81 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