2016-05-18 5 views
2

下のパンダのDataFrameが既に列Aにソートされているとします。ソートされたDataFrameを停止基準にグループ化するにはどうすればよいですか?

A | B 
----- 
0 | 0 
1 | 1 
2 | 2 
3 | 3 
4 | 4 
5 | 0 
6 | 1 
7 | 2 
8 | 3 
9 | 4 
10 | 0 
11 | 1 
12 | 2 
13 | 3 
14 | 4 

その列の値がダウンからどこに行くか、私は列Bに「停止ポイント」に基づいて3つのグループにグループにこのことを伝えたい:

import pandas as pd 
data = {'A': range(15), 
     'B': range(5)*3} 
df = pd.DataFrame(data) 
# just in case: 
df.sort('A', inplace=True) 

結果のデータフレームは、次のようになりますグループを区別する鍵がないため、groupbyを素朴に使用することはできません。

個々の行をソート順に反復することでこれを行うのは簡単ですが、パンダ固有のソリューションがあるかどうかは疑問でした。

+0

これは助けることができます:http://pandas.pydata.org/pandas-docs/stable/groupby.html –

答えて

2

あなたはcumsumでGROUPBYのために新しい列Cを作成することができIIUC:

df['C'] = ((df.B == 0).cumsum()) 

print (df) 
    A B C 
0 0 0 1 
1 1 1 1 
2 2 2 1 
3 3 3 1 
4 4 4 1 
5 5 0 2 
6 6 1 2 
7 7 2 2 
8 8 3 2 
9 9 4 2 
10 10 0 3 
11 11 1 3 
12 12 2 3 
13 13 3 3 
14 14 4 3 

print (df.groupby('C').sum()) 
    A B 
C   
1 10 10 
2 35 10 
3 60 10 

かそれ以上groupbySeriesによって:

for i, g in df[['A','B']].groupby([((df.B == 0).cumsum())]): 
    print (i) 
    print (g)  

1 
    A B 
0 0 0 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
2 
    A B 
5 5 0 
6 6 1 
7 7 2 
8 8 3 
9 9 4 
3 
    A B 
10 10 0 
11 11 1 
12 12 2 
13 13 3 
14 14 4 

dfs = {i-1: g for i,g in df[['A','B']].groupby([((df.B == 0).cumsum())])} 
print (dfs[0]) 
    A B 
0 0 0 
1 1 1 
2 2 2 
3 3 3 
4 4 4 

print (df[['A','B']].groupby([((df.B == 0).cumsum())]).sum()) 
    A B 
B   
1 10 10 
2 35 10 
3 60 10 

グループを格納するために使用可能性がdict理解あります

+0

あなたの答えの最初の部分はまさに私が必要としたものです。 – abeboparebop

関連する問題