Панды: удалить старый DataFrame из памяти после группового - PullRequest
0 голосов
/ 26 ноября 2018
  value  Group  something
0     a    1          1
1     b    1          2
2     c    1          4
3     c    2          9
4     b    2         10
5     x    2          5
6     d    2          3
7     e    3          5
8     d    2         10
9     a    3          5

Я хочу выбрать последние 3 строки каждой группы (из приведенного выше df), как показано ниже, но выполнить операцию, используя Inplace.Я хочу убедиться, что после назначения я сохраняю в памяти только новый объект df.Каков будет эффективный способ сделать это?

df = df.groupby('Group').tail(3)

Результат должен выглядеть следующим образом:

  value  Group  something
0     a    1          1
1     b    1          2
2     c    1          4
5     x    2          5
6     d    2          3
7     e    3          5
8     d    2         10
9     a    3          5

Примечание: - Этот вопрос относится к Хранение последних N дубликатов в пандах

Ответы [ 3 ]

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

Слишком усердно пытаешься угадать, чего ты хочешь.

ПРИМЕЧАНИЕ: при использовании аргумента Pandas inplace, где он доступен, NO гарантирует, что новый DataFrame не будет создан в памяти.На самом деле, он вполне может создать новый DataFrame в памяти и заменить старый за кадром.

from collections import defaultdict

def f(s):
  c = defaultdict(int)
  for i, x in zip(s.index[::-1], s.values[::-1]):
    c[x] += 1
    if c[x] > 3:
      yield i

df.drop([*f(df.Group)], inplace=True)
df

  value  Group  something
0     a      1          1
1     b      1          2
2     c      1          4
5     x      2          5
6     d      2          3
7     e      3          5
8     d      2         10
9     a      3          5
0 голосов
/ 26 ноября 2018

Ваш ответ уже есть в Посте. Однако, как уже говорилось ранее в комментариях, вы перезаписываете существующий df, поэтому во избежание этого присвойте новое имя столбца, как показано ниже:

df['new_col'] = df.groupby('Group').tail(3)

Однако из любопытства, если вас не интересует групповой режим, и вы ищете только N последних строк df yo, можете сделать это, как показано ниже:

df[-2:]   #  last 2 rows
0 голосов
/ 26 ноября 2018

df = df.groupby('Group').tail(3) уже эффективный способ сделать это.Поскольку вы перезаписываете переменную df, Python позаботится об освобождении памяти старого фрейма данных, и у вас будет доступ только к новому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...