Панды - сгруппировать по первому вхождению и при каждом третьем вхождении значения - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь отфильтровать записи из Dataframe по их появлению. Я пытаюсь отфильтровать first occurence, а затем на every third occurence на основе emp_id. Ниже приведен пример моего Dataframe.

emp_id,date,value
101,2018-12-01,10001
101,2018-12-03,10002
101,2018-12-05,10003
101,2018-12-13,10004

В приведенном выше примере ожидаемый результат:

emp_id,date,value
101,2018-12-01,10001
101,2018-12-13,10004

Ниже приведен код, который я построил так далеко:

df['emp_id'] = df.groupby('emp_id').cumcount()+1
df['emp_id'] = np.where((df['emp_id']%3)==0,1,0)

Однако после этого возвращается 2nd occurence и every third occurrence. Как я могу изменить так, чтобы он возвращал обратно first occurence, а затем every third occurence на основе emp_id

1 Ответ

0 голосов
/ 08 января 2019

Я думаю, вам нужно boolean indexing с проверкой 0 или 1, назначение столбцу не требуется, возможно создание помощника Series s:

print (df)
   emp_id        date  value
0     101  2018-12-01  10001
1     101  2018-12-03  10002
2     101  2018-12-05  10003
3     101  2018-12-13  10004
4     101  2018-12-01  10005
5     101  2018-12-03  10006
6     101  2018-12-05  10007
7     101  2018-12-13  10008

s = df.groupby('emp_id').cumcount()
df['check'] = (s % 3) == 0

Альтернатива:

s = df.groupby('emp_id').cumcount()  + 1
df['check'] = (s % 3) == 1

print (df)
   emp_id        date  value  check
0     101  2018-12-01  10001   True
1     101  2018-12-03  10002  False
2     101  2018-12-05  10003  False
3     101  2018-12-13  10004   True
4     101  2018-12-01  10005  False
5     101  2018-12-03  10006  False
6     101  2018-12-05  10007   True
7     101  2018-12-13  10008  False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...