Удалить последние n строк в пределах pandas dataframe groupby - PullRequest
3 голосов
/ 13 июля 2020

У меня есть фрейм данных df, в котором я хочу удалить последние n строки в группе столбцов. Например, скажем, df определяется следующим образом: группа состоит из столбцов a и b:

>>> import pandas as pd
>>> df = pd.DataFrame({'a':['abd']*4 + ['pqr']*5 + ['xyz']*7, 'b':['john']*7 + ['doe']*9, 'c':range(16), 'd':range(1000,1016)})
>>> df
      a     b   c     d
0   abd  john   0  1000
1   abd  john   1  1001
2   abd  john   2  1002
3   abd  john   3  1003
4   pqr  john   4  1004
5   pqr  john   5  1005
6   pqr  john   6  1006
7   pqr   doe   7  1007
8   pqr   doe   8  1008
9   xyz   doe   9  1009
10  xyz   doe  10  1010
11  xyz   doe  11  1011
12  xyz   doe  12  1012
13  xyz   doe  13  1013
14  xyz   doe  14  1014
15  xyz   doe  15  1015
>>> 

Желаемый результат для n=2 выглядит следующим образом:

>>> df
      a     b   c     d
0   abd  john   0  1000
1   abd  john   1  1001
4   pqr  john   4  1004
9   xyz   doe   9  1009
10  xyz   doe  10  1010
11  xyz   doe  11  1011
12  xyz   doe  12  1012
13  xyz   doe  13  1013
>>>

Требуемый вывод для n=3 выглядит следующим образом:

>>> df
      a     b   c     d
0   abd  john   0  1000
9   xyz   doe   9  1009
10  xyz   doe  10  1010
11  xyz   doe  11  1011
12  xyz   doe  12  1012
>>> 

Ответы [ 2 ]

3 голосов
/ 13 июля 2020

Вы можете использовать groupby и drop, как показано ниже:

n = 2
df.drop(df.groupby(['a','b']).tail(n).index, axis=0)
1 голос
/ 13 июля 2020

Вы можете получить значения индекса tail(n) записей для каждой группы и использовать .loc с ~, чтобы исключить их.

n=3
df.loc[~df.index.isin(df.groupby(['a','b']).tail(n).index.values)]

Вывод

      a    b    c      d
0   abd john    0   1000
9   xyz doe     9   1009
10  xyz doe    10   1010
11  xyz doe    11   1011
12  xyz doe    12   1012
...