Извлечение групповых наблюдений из кадра данных панд

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

         Var1    Var2
    0     1      1.2
    1     2      1.3
    2     2      1.4
    3     1      1.5
    4     1      1.6
    5     2      1.7
    6     1      1.8
    7     1      1.9
    8     2      2.0
    9     1      2.1
   10     2      2.2
   11     1      2.3

Я хочу сначала отсортировать его по var1:

         Var1    Var2
    0     1      1.2
    1     1      1.5
    2     1      1.6
    3     1      1.8
    4     1      1.9
    5     1      2.1
    6     1      2.3
    7     2      1.3
    8     2      1.4
    9     2      1.7
   10     2      2.0
   11     2      2.2

а затем сохраните первые два наблюдения каждой группы и поместите их в новый фрейм данных:

         Var1    Var2
    0     1      1.2
    1     1      1.5
    2     2      1.3
    3     2      1.4

Я знаю, как использовать group by, но мне не ясно, как выполнить второй шаг. Огромное спасибо за помощь.

1 ответ

Решение

Использование sort_values с groupby а также head:

df = df.sort_values('Var1').groupby('Var1').head(2).reset_index(drop=True)
print (df)
   Var1  Var2
0     1   1.2
1     1   1.5
2     2   1.3
3     2   1.4

df = df.groupby('Var1').head(2).sort_values('Var1').reset_index(drop=True)
print (df)
   Var1  Var2
0     1   1.2
1     1   1.5
2     2   1.3
3     2   1.4

Другое решение с iloc:

df = df.groupby('Var1')['Var2']
       .apply(lambda x: x.iloc[:2])
       .reset_index(level=1, drop=True)
       .reset_index()
print (df)
   Var1  Var2
0     1   1.2
1     1   1.5
2     2   1.3
3     2   1.4

Замечания:

Для более старой версии изменения панд sort_values в sort, а точнее обновить до последней версии.

Другие вопросы по тегам