pandas groupby, хранить только строки с первым вхождением

#python #pandas

#python #pandas

Вопрос:

Это медленное решение для того, чего я надеюсь достичь. Проблема в производительности. Есть ли более «пандонический» способ добиться этого без определяемой пользователем функции? Цель состоит в том, чтобы сохранить только все строки, имеющие первую временную метку, которая встречается в каждой группе.

 def get_first_id_time(df):
    first_time = df['datetime'][0]
    df = df.loc[df['datetime']==first_time]

    return df

data = data.groupby('id').apply(get_first_id_time)
  

РЕДАКТИРОВАТЬ: обратите внимание, для каждой группы есть много строк с datetime=first_time .

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

1. используйте drop_duplicate(keep=first)

2. В этом случае вы могли бы выполнить сортировку по id и datetime , а затем drop_duplicates id с помощью параметра keep='first'

3. Похоже, вам просто нужно data.groupby('id').head(1)

4. Возможно, это недостаточно ясно — есть много строк, которые равны «first_time». Таким образом, сохранение только первой строки не работает.

5. Тогда это transform маска с логическим рядом: data[data.groupby('id').datetime.transform(min) == data.datetime] . Где-то есть дублирование

Ответ №1:

Можете ли вы просто получить min дату и время и merge ?

 min_datetime = data.groupby('id')['datetime'].min().reset_index()

data = data.merge(min_datetime, how='inner', on='id')
  

Редактировать:

Поскольку существует много строк, которые имеют одинаковое first_datetime значение, только merge для обоих datetime и id .