#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'))
```