2016-05-18 2 views
2

Предположим, у меня есть pandas DataFrame, ниже которого уже отсортировано по столбцу A.Как я могу группировать отсортированный DataFrame по критерию остановки?

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

В результате 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 где значение этого столбца идет вниз от 4 до 0. Наивное использование groupby не может учитывать это, потому что нет ключа, который отличает группы.

Было бы просто сделать это, перебирая отдельные строки в отсортированном порядке, но мне было интересно, существует ли решение, основанное на pandas.

+0

возможно это может помочь: http://pandas.pydata.org/pandas-docs/stable/groupby.html –

ответ

2

IIUC вы можете создать новый столбец C для GroupBy по cumsum:

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 

Или лучше groupby по Series:

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

Для хранения групп Возможное использование dict понимание:

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 
+0

Первая часть вашего ответа - именно то, что мне нужно. – abeboparebop

Смежные вопросы