Pandas группировка и условная проверка нескольких столбцов - PullRequest
1 голос
/ 06 мая 2020

У меня есть такой фрейм данных:

id date         status value
1  2009-06-17   1      NaN  
1  2009-07-17   B      NaN 
1  2009-08-17   A      NaN 
1  2009-09-17   5      NaN 
1  2009-10-17   0      0.55
2  2010-07-17   B      NaN 
2  2010-08-17   A      NaN 
2  2010-09-17   0      0.00

Теперь я хочу сгруппировать по идентификатору, а затем проверить, становится ли значение ненулевым после изменения статуса на A. Итак, для группы с id = 1 статус действительно изменяется на A и после (с точки зрения даты) это значение также становится ненулевым. Но для группы с id = 2, даже после изменения статуса на A, значение не становится ненулевым. Обратите внимание, что если статус не изменится на A, мне даже не нужно проверять значение.

Итак, наконец, мне нужен новый фрейм данных, например:

id check
1  True
2  False

1 Ответ

2 голосов
/ 06 мая 2020

Используйте:

print (df)
   id        date status  value
0   1  2009-06-17      1    NaN
1   1  2009-07-17      B    NaN
2   1  2009-08-17      A    NaN
3   1  2009-09-17      5    NaN
4   1  2009-10-17      0   0.55
5   2  2010-07-17      B    NaN
6   2  2010-08-17      A    NaN
7   2  2010-09-17      0   0.00
8   3  2010-08-17      R    NaN
9   3  2010-09-17      0   0.00

idx = df['id'].unique()
#filter A values
m = df['status'].eq('A')
#filter all rows after A per groups
df1 = df[m.groupby(df['id']).cumsum().gt(0)]
print (df1)
   id        date status  value
2   1  2009-08-17      A    NaN
3   1  2009-09-17      5    NaN
4   1  2009-10-17      0   0.55
6   2  2010-08-17      A    NaN
7   2  2010-09-17      0   0.00

#compare by 0 and test if no 0 value per group and last added all posible id by reindex
df2 = (df1['value'].ne(0)
                   .groupby(df1['id'])
                   .all()
                   .reindex(idx, fill_value=False)
                   .reset_index(name='check'))
print (df2)
   id  check
0   1   True
1   2  False
2   3  False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...