2017-01-12 4 views
4

У меня есть dataframe, который был отсортирован пользователем и времяGroupBy условной суммы смежных рядов панда

df = pd.DataFrame({'user' : ['A', 'A', 'A', 'B', 'B', 'B','B'], 
       'location' : ['house','house','gym','gym','shop','gym','gym'], 
       'duration':[10,5,5,4,10,4,6]}) 


    duration location user 
0  10 house A 
1   5 house A 
2   5  gym A 
3   4  gym B 
4  10  shop B 
5   4  gym B 
6   6  gym B 

Я только хочу, чтобы сделать сумму(), когда «расположение» поля одинаковы по смежному строк для данного пользователя. Таким образом, это не просто df.groupby (['id', 'location']). Duration.sum(). Желаемый результат будет выглядеть следующим образом. Кроме того, порядок важен.

duration location user 
     15 house A 
     5  gym A 
     4  gym B 
     10  shop B 
     10  gym B 

Спасибо!

ответ

6

Поставка sort=False, чтобы сохранить порядок между такими группами, как он появился в оригинале DF. Затем вычислите сгруппированную сумму длительностью.

adj_check = (df.location != df.location.shift()).cumsum() 
df.groupby(['user', 'location', adj_check], as_index=False, sort=False)['duration'].sum() 

enter image description here


Единственное изменение, которое должно быть сделано к тому, что вы уже пробовали, прежде чем это условие, которое группирует все подобные последовательные строки в одной уникальной группы:

(df.location != df.location.shift()).cumsum() 
0 1 
1 1 
2 2 
3 2 
4 3 
5 4 
6 4 
Name: location, dtype: int32 
+0

Я предположил, что OP хочет смежных внутри группы? Непонятно – piRSquared

+0

Вправо, только в пределах группы «пользователь». Я отредактирую свой вопрос, чтобы сделать его более ясным. Спасибо – user42361

+0

Я поднял его, потому что '' 'тесты для смежности вне группировки. Это может быть неважно. Я пытаюсь думать о примере счетчика – piRSquared

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