熊猫:groupby之后从内存中删除旧的DataFrame

时间:2018-11-26 17:03:00

标签: python pandas

  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.B:-这个问题与Keeping the last N duplicates in pandas

有关

3 个答案:

答案 0 :(得分:1)

df = df.groupby('Group').tail(3)已经是一种有效的方法。因为您要覆盖df变量,所以Python将负责释放旧数据帧的内存,并且您只能访问新数据帧。

答案 1 :(得分:1)

尝试方式太难猜测您想要什么。

注意::使用熊猫inplace参数(如果可用)为,以确保不会在内存中创建新的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

答案 2 :(得分:1)

您的答案已经包含在Post中,但是正如前面在评论中所述,您正在覆盖现有df,因此请避免像下面这样分配新的列名:

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

但是,出于好奇,如果您不关心groupby,仅查找df yo的最后N行,可以执行以下操作:

df[-2:]   #  last 2 rows