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
有关答案 0 :(得分:1)
df = df.groupby('Group').tail(3)
已经是一种有效的方法。因为您要覆盖df
变量,所以Python将负责释放旧数据帧的内存,并且您只能访问新数据帧。
答案 1 :(得分:1)
尝试方式太难猜测您想要什么。
注意::使用熊猫inplace
参数(如果可用)为否,以确保不会在内存中创建新的DataFrame
。实际上,它很可能会在内存中创建一个新的DataFrame
并替换幕后的旧{1>}。
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