2015-11-18 2 views
4

У меня возникли проблемы с фильтрацией все, кроме последнего элемента 1 в каждой группе GroupBy объекта pandas.DataFrame:.Head() и .tail() с отрицательными индексами на панд GroupBy объект

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 

т.е. сбросив последний элемент каждой группы, а затем слияние его обратно в dataframe. Если это всего лишь ошибка в пандах, я был бы благодарен всем, кто предлагает альтернативный подход.

+0

https://github.com/pydata/pandas/issues/9214 – TomAugspurger

+0

спасибо, не удалось найти его. однако предлагаемый метод обхода (.apply) закручивает индекс в результате DF, можете ли вы указать мне, как вернуться к индексированию на основе целых чисел после .apply'ing? – whoever

+0

g.apply (lambda x: x.head (-1)). Reset_index (drop = True), кажется, решает мою проблему – whoever

ответ

2

As прокомментировал, что они еще не реализованы в пандах. Тем не менее, вы можете использовать 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

Как указывает @TomAugspurger, это открытая ошибка в панд и g.apply (лямбда-х: x.head (-1)) способен эмулировать необходимую логику, однако результат становится:

A B 
A   
a 0 a 1 
    2 a 2 
b 1 b 1 
    3 b 2 

, но после того, что можно применить .reset_index(drop=True) (падение ума = 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)

+0

Просто обычное предупреждение о применении, это может быть медленным (вот почему мы специально сгруппировали groupby head для использования cumcount под капотом, по крайней мере первоначально не на 100% уверен, если он все еще делает). :) –

Смежные вопросы