Python Pandas:在groupby之后从内存中删除旧数据帧

Python Pandas:在groupby之后从内存中删除旧数据帧,python,pandas,Python,Pandas,我想选择每组的最后3行(来自上面的df),如下所示,但使用Inplace执行操作。我想确保在赋值之后,我只在内存中保留新的df对象。什么是有效的方法 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

我想选择每组的最后3行(来自上面的df),如下所示,但使用Inplace执行操作。我想确保在赋值之后,我只在内存中保留新的df对象。什么是有效的方法

  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
结果应如下所示:

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

注意:这个问题与df=df.groupby('Group')有关。tail(3)已经是一种有效的方法。因为您正在覆盖
df
变量,Python将负责释放旧数据帧的内存,并且您将只能访问新数据帧。

尝试太难了,无法猜测您想要什么

注意:使用Pandas
in place
参数(如果可用)是NO可以保证不会在内存中创建新的
数据帧。事实上,它很可能在内存中创建一个新的
数据帧
,并在幕后替换旧的数据帧

  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

您的答案已经在帖子中,但是正如前面在评论中所说的,您正在覆盖现有的df,以避免指定一个新的列名,如下所示:

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
df['new_col'] = df.groupby('Group').tail(3)
然而,出于好奇,如果您不关心groupby,并且只查找df-yo的最后N行,则可以如下所示:

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
df['new_col'] = df.groupby('Group').tail(3)

为什么不想使用您使用的作为示例(
df=df.groupby('Group').tail(3)
)?您不能执行inplace groupby,因为分组数据帧是一个完全不同的对象。当您覆盖它时,只能使用新的..@gibbz00,这也会发生在当前公式中。一旦不再有对旧数据帧的活动引用,Python的垃圾收集将处理旧数据帧。@gibbz00给输出df一个新名称(
df_grouped=df.groupby('Group')。tail(3)
)意味着
df
仍然引用旧数据帧,而
df_grouped
引用新数据帧。现在,它们都将存储在内存中。最好指定新列名,如
df['new\u col']=df.groupby('Group')。tail(3)
,如果不想覆盖?我正在设想一个类似这样的解决方案,因为drop有一个Inplace参数。但是,我不知道
df=df.groupby('Group')。tail(3)
已经确保旧的df在被覆盖后从内存中释放。是的,如果您不关心临时内存被消耗然后被释放,那么您绝对应该使用
df.groupby('Group').tail(3)
。您没有提到性能,所以我认为这不是问题。星号(*)在[*f(df.Group)]中做了什么?
*
在该上下文中是参数解包变量<代码>[*f(df.Group)]
是一种奇特的方法,可以这样做
列表(f(df.Group))