Манипулирование дублирующимися строками в подмножестве столбцов в пандах данных - PullRequest
0 голосов
/ 06 ноября 2018

Предположим, у меня есть следующий фрейм данных:

df = pd.DataFrame({"user":[11,11,11,21,21,21,21,21,32,32], 
               "event":[0,0,1,0,0,1,1,1,0,0], 
               "datetime":['05:29:54','05:32:04','05:32:08',
                           '15:35:26','15:36:07','15:36:16','15:36:50','15:36:54',
                           '09:29:12', '09:29:25'] })

enter image description here

Я хотел бы обработать повторяющиеся строки в первом столбце (пользователь), чтобы получить следующее.

enter image description here

В этом случае мы заменяем столбец 'event' на максимальное значение, связанное с столбцом 'user' (например, для user = 11, максимальное значение для события равно 1). А третий столбец заменяется средним значением даты и времени.

P.S. Уже говорилось о том, чтобы отбрасывать повторяющиеся строки здесь , однако я не хочу отбрасывать строки вслепую. Особенно, когда я имею дело с фреймом данных с большим количеством атрибутов.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Вы можете преобразовать datetime s в собственные целые числа и агрегировать mean, последнее преобразование назад и для HH:MM:SS строк используйте strftime:

df['datetime'] = pd.to_datetime(df['datetime']).astype(np.int64)

df1 = df.groupby('user', as_index=False).agg({'event':'max', 'datetime':'mean'})
df1['datetime'] = pd.to_datetime(df1['datetime']).dt.strftime('%H:%M:%S')
print (df1)
   user  event  datetime
0    11      1  05:31:22
1    21      1  15:36:18
2    32      0  09:29:18
0 голосов
/ 06 ноября 2018

Вы хотите groupby и aggregate

df.groupby('user').agg({'event': 'max', 
                        'datetime': lambda s: pd.to_timedelta(s).mean()})

Если хотите, вы также можете сначала изменить столбец datetime на timedelta, используя pd.to_timedelta, и просто взять mean в agg

Вы можете использовать str, чтобы представить, как вы собираетесь

df.groupby('user').agg({'event': 'max', 
                        'datetime': lambda s: str(pd.to_timedelta(s).mean().to_pytimedelta())})
...