Панды: Как получить верхние 2, средние 2 и нижние 2 строки в каждой группе - PullRequest
0 голосов
/ 15 ноября 2018

Допустим, у меня есть датафрейм df, как показано ниже.Чтобы получить 1-е, 2-е и 2-е место в каждой группе, я использовал groupby.nth

df = pd.DataFrame({'A': ['a','a','a','a','a','a','a','a','b','b','b','b','b','b','b'],
                   'B': [1, 2, 3, 4, 5,6,7,8,1, 2, 3, 4, 5,6,7]}, columns=['A', 'B'])
df.groupby('A').nth([0,1,-2,-1])

Результат:

    B
A   
a   1
a   2
a   7
a   8
b   1
b   2
b   6
b   7

Я не уверен, как получить средние 2 строки.Например, в группе 'A' есть 8 экземпляров, поэтому моя середина будет 4, 5 (n/2, n/2+1), а в группе 'B' мои средние строки будут 3, 4 (n/2-0.5, n/2+0.5).Любое руководство приветствуется.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

ответ Сакала приятно, здесь я просто следую вашей собственной идее для определения функции настройки

def middle(x):
     if len(x) % 2 == 0:
         return x.iloc[int(len(x) / 2) - 1:int(len(x) / 2) + 1]
     else:
         return x.iloc[int((len(x) / 2 - 0.5)) - 1:int(len(x) / 2 + 0.5)]

pd.concat([middle(y) for _ , y in df.groupby('A')])
Out[25]:
    A  B
3   a  4
4   a  5
10  b  3
11  b  4
0 голосов
/ 15 ноября 2018

Вы можете использовать iloc, чтобы найти индексы n//2 -1 и n//2 для каждой группы (// - деление по полу):

g = df.groupby('A')

g.apply(lambda x: x['B'].iloc[[len(x)//2-1, len(x)//2]])

A    
a  3     4
   4     5
b  10    3
   11    4
Name: B, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...