Как сохранить только последовательные значения в кадре данных Pandas, используя Python - PullRequest
9 голосов
/ 20 мая 2019

У меня есть датафрейм, который выглядит так:

Enter image description here

Я хочу сохранить только последовательные годы в каждой группе, например, следующий рисунок, где 2005 год в группе A и 2009 и 2011 годы в группе B удалены.

Enter image description here

Я создал столбец разницы в году с помощью df['year_diff']=df.groupby(['group'])['Year'].diff(), а затем сохранил только те строки, в которых разница в году была равна 1.

Однако этот метод также удалит первую строку в каждой последовательной группе лет, поскольку разница в году в первой строке будет равна NAN. Например, 2000 год будет удален из группы 2000-2005. Есть ли способ, которым я могу сделать, чтобы избежать этой проблемы?

Ответы [ 3 ]

7 голосов
/ 20 мая 2019

shift

Получите разницу между годами, как это сделал первый OP. Затем проверьте, равен ли 1 или предыдущее значение 1

yd = df.Year.groupby(df.group).diff().eq(1)
df[yd | yd.shift(-1)]

   group  Year
0      A  2000
1      A  2001
2      A  2002
3      A  2003
5      A  2007
6      A  2008
7      A  2009
8      A  2010
9      A  2011
10     B  2005
11     B  2006
12     B  2007
15     B  2013
16     B  2014
17     B  2015
18     B  2016
19     B  2017

Настройка

Thx Jez

a = [('A',x) for x in range(2000, 2012) if x not in [2004,2006]]
b = [('B',x) for x in range(2005, 2018) if x not in [2008,2010,2012]]
df = pd.DataFrame(a + b, columns=['group','Year'])
5 голосов
/ 20 мая 2019

Если я правильно понимаю, с помощью diff и cumsum создайте дополнительный ключ группы, затем groupby it и столбцы вашей группы и сбросьте count, равный 1.

df[df.g.groupby([df.g,df.Year.diff().ne(1).cumsum()]).transform('count').ne(1)]

Out[317]:
    g  Year
0   A  2000
1   A  2001
2   A  2002
3   A  2003
5   A  2007
6   A  2008
7   A  2009
8   A  2010
9   A  2011
10  B  2005
11  B  2006
12  B  2007
15  B  2013
16  B  2014
17  B  2015
18  B  2016
19  B  2017

Данные

df=pd.DataFrame({'g':list('AAAAAAAAAABBBBBBBBBB',
                 'Year':[2000,2001,2002,2003,2005,2007,2008,2009,2010,2011,2005,2006,2007,2009,2011,2013,2014,2015,2016,2017])]})
0 голосов
/ 20 мая 2019

Вы можете иметь два столбца для различий. Один для отличия от следующего ряда и один от предыдущего ряда. Затем вы можете использовать np.where для фильтрации столбцов, которые имеют значения 1 для первой разницы ИЛИ -1 для второй разницы.

df=pd.DataFrame({'group':list('AAAAAAAAAABBBBBBBBBB'),'Year':[2000,2001,2002,2003,2005,2007,2008,2009,2010,2011,2005,2006,2007,2009,2011,2013,2014,2015,2016,2017]})
df['year_diff']=df.groupby(['group'])['Year'].diff()
df['year_diff2']=df.groupby(['group'])['Year'].diff(-1)
df['check']=np.where((df.year_diff==1) | (df.year_diff2==-1),True,False)

А затем отбросьте все строки, где df.check == False.

Это похоже на длинный метод, но я думаю, что довольно легко логически следовать процессу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...