Python Pandas:在groupby之后从内存中删除旧数据帧
我想选择每组的最后3行(来自上面的df),如下所示,但使用Inplace执行操作。我想确保在赋值之后,我只在内存中保留新的df对象。什么是有效的方法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
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将负责释放旧数据帧的内存,并且您将只能访问新数据帧。尝试太难了,无法猜测您想要什么
注意:使用Pandasin 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))