.and()和.tail()在pandas GroupBy对象上有负索引

时间:2015-11-18 14:47:04

标签: python pandas group-by

我无法过滤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')

正如预期的那样(根据documentationg.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

即。删除每个组的最后一个元素,然后将其合并回数据帧。如果那只是大熊猫中的错误,我会感激任何提出替代方法的人。

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)