我无法过滤pandas.DataFrame的每组groupby对象中除最后1个元素之外的所有元素:
x = pd.DataFrame([['a', 1], ['b', 1], ['a', 2], ['b', 2], ['a', 3], ['b', 3]],
columns=['A', 'B'])
g = x.groupby('A')
正如预期的那样(根据documentation)g.head(1)
返回
A B
0 a 1
1 b 1
而g.head(-1)
返回空DataFrame
从x.head(-1)
的行为开始,我希望它能够返回
A B
0 a 1
1 b 1
2 a 2
3 b 2
即。删除每个组的最后一个元素,然后将其合并回数据帧。如果那只是大熊猫中的错误,我会感激任何提出替代方法的人。
答案 0 :(得分:3)
评论说这些尚未在熊猫中实施。但是,您可以使用cumcount有效地实现它们:
def negative_head(g, n):
return g._selected_obj[g.cumcount(ascending=False) >= n]
def negative_tail(g, n):
return g._selected_obj[g.cumcount() >= n]
In [11]: negative_head(g, 1) # instead of g.head(-1)
Out[11]:
B
0 1
1 1
2 2
3 2
答案 1 :(得分:1)
正如@TomAugspurger所指出的那样,它是pandas中的一个开放性bug,而g.apply(lambda x:x.head(-1))能够模拟所需的逻辑,但结果变为:
A B
A
a 0 a 1
2 a 2
b 1 b 1
3 b 2
但之后可以申请.reset_index(drop=True)
(在这里注意掉落=真)并返回
A B
0 a 1
1 a 2
2 b 1
3 b 2
因此,目前的解决方法是g.apply(lambda x: x.head(-1)).reset_index(drop=True)