2017-02-03 6 views
2

У меня есть дата-схема, и я хотел бы сгруппировать (или отрезать ее). Dataframe находится в формеГруппа данных данных, когда определенные значения встречаются в заданной строке

A B C 
a b 1 
a b 0 
a b 1 
a b 2 
a b 0 
a e 3 
a e 3 
f g 6 
f g 7 
f g 0 

Я хотел бы первой группе dataframe на колонке А и В. Затем каждая группа дополнительно разбита на определенную величину на более мелкие группы с последовательными рядами. Например, после группировки блока данных по столбцам A и B, я хотел бы уточнить группировку на третьем уровне каждый раз, когда я столкнулся с 0 в столбце C. Так сгруппированных dataframe подобен

A B C 
a b 1 
a b 0 

a b 1 
a b 2 
a b 0 

a e 3 
a e 3 

f g 6 
f g 7 
f g 0 

Группировки в dataframe по значениям столбцов, как столбцы А и В в примере является простым, но я не знаю, как дальше группа по уровню 3 в последовательные строки с определенными точками разреза. Заранее благодарю вас за помощь.

+1

бутона, ваш вопрос не имеет смысла. что вы подразумеваете под делением на определенное значение? разделите группы на 0 означает ничего –

+0

Английский выпуск, здесь делят на самом деле означает * cut *, * split * или * partition *, см. ниже – Boud

+0

@Noobie смотреть anwser и исправлять OP – Boud

ответ

1

Для этого подхода является непрестанно тот же: создать дополнительный столбец (или несколько иногда), который представляет вашу конкретную группировку логики, то группу против него:

df.groupby(['A', 'B', 'cut_point']).groups 
Out[139]: 
{('a', 'b', 0.0): Int64Index([0, 1], dtype='int64'), 
('a', 'b', 1.0): Int64Index([2, 3, 4], dtype='int64'), 
('a', 'e', 2.0): Int64Index([5, 6], dtype='int64'), 
('f', 'g', 2.0): Int64Index([7, 8, 9], dtype='int64')} 

df['cut_point'] = (df.C==0).cumsum().shift().fillna(0) 

df.groupby(['A', 'B', 'cut_point']).groups 
Out[141]: 
{('a', 'b', 0.0): Int64Index([0, 1], dtype='int64'), 
('a', 'b', 1.0): Int64Index([2, 3, 4], dtype='int64'), 
('a', 'e', 2.0): Int64Index([5, 6], dtype='int64'), 
('f', 'g', 2.0): Int64Index([7, 8, 9], dtype='int64')} 
+0

ok my man. upvoted вы –

+0

ответ работает для моей проблемы. Большое спасибо за этот подход, особенно он может быть обобщен во многих других проблемах. –