Агрегировать одинаковые соединительные строки во фрейме данных pandas (группы временных рядов)

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Предположим, что временной ряд, например.:

 Time  Hours col1  col2  col3
10:00     2 True  True  False
12:00     1 True  True  False
13:00     2 False False False
15:00     1 False False False
16:00     1 True  True  False
17:00     1 True  True  False
  

Я хочу сгруппировать строки с одинаковыми логическими значениями, но только если они связаны.
Результат должен быть следующим:

 Time  Hours col1  col2  col3
10:00     3 True  True  False
13:00     3 False False False
16:00     2 True  True  False
  

Любая помощь?

Ответ №1:

Если требуется группировка по последовательному логическому значению, сначала создайте последовательные группы по shift , any и cumsum , а затем агрегируйте first для всех столбцов без Hours , это агрегирует по sum :

 df1 = df.select_dtypes(bool)

g = df1.ne(df1.shift()).any(axis=1).cumsum()
d = dict.fromkeys(df.columns, 'first')
d['Hours'] = 'sum'

df = df.groupby(g).agg(d)
print (df)
    Time  Hours   col1   col2   col3
1  10:00      3   True   True  False
2  13:00      3  False  False  False
3  16:00      2   True   True  False
  

Комментарии:

1. Большое спасибо! cumsum() была функцией, которую я не мог понять.

Ответ №2:

вы могли бы сделать:

 cond = (df[['col1', 'col2', 'col3']] == df[['col1', 'col2', 'col3']].shift()).all(axis=1)
df.groupby(cond[::-1].cumsum()).agg(dict(Time='first',  Hours='sum', 
                                        col1='first', col2="first", col3='first'))
```