pandas: итерация с условными операторами внутри группы - PullRequest
0 голосов
/ 11 июля 2020

У меня есть фреймворк, который выглядит примерно так (обратите внимание, что это пример, мой фактический фреймворк содержит тысячи строк с сотнями групп)

pd.DataFrame({'a':['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'], 
              'year':[2018, 2019, 2020, 2018, 2020, 2018, 2019, 2020], 
              'c':[1, 2, 4, 2, 4, 4, 4, 3]})

   a  year  c
0  A  2018  1
1  A  2019  2
2  A  2020  4
3  B  2018  2
4  B  2020  4
5  C  2018  4
6  C  2019  4
7  C  2020  3

Мне нужно проверить следующие условия для каждой группы в столбце 'a':

  1. - это одна строка на каждый год (ie. 2018, 2019, 2020) существует
  2. увеличивается ли значение в столбце 'c' из года в год ie. - это значение для 2020 года выше, чем для 2019 года, чем для 2018

, если оба условия истинны. Мне нравится устанавливать значение «ИСТИНА» в столбце «d» для этой группы

   a  year  c   d
0  A  2018  1  TRUE
1  A  2019  2  TRUE
2  A  2020  4  TRUE
3  B  2018  2  FALSE
4  B  2020  4  FALSE
5  C  2018  4  FALSE
6  C  2019  4  FALSE
7  C  2020  3  FALSE

в моем примере только группа A удовлетворяет обоим условиям. В группе B нет данных за 2019 год, а в группе C значения не увеличиваются от года к году.

Я пробовал groupby, но ничего не добился. Я думаю, это требует iterows, но не знаю, с чего начать.

1 Ответ

1 голос
/ 11 июля 2020

Мы можем выполнить условие с помощью apply + reindex

df['cond']=df.groupby('a').apply(lambda x : pd.Series([2018,2019,2020]).isin(x['year']).all() & x['c'].diff().fillna(1).gt(0).all()).reindex(df.a).values
df
   a  year  c   cond
0  A  2018  1   True
1  A  2019  2   True
2  A  2020  4   True
3  B  2018  2  False
4  B  2020  4  False
5  C  2018  4  False
6  C  2019  4  False
7  C  2020  3  False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...