Присвоить фиктивное значение всей группе, если хотя бы одно значение в группе удовлетворяет условию

#python #pandas #group-by #pandas-groupby

#python #панды #группировать по #панды-группировка #pandas #pandas-groupby

Вопрос:

В частности, я хочу иметь фиктивную переменную для определения того, есть ли отсутствующее значение для определенной группы. Мой фрейм данных выглядит следующим образом:

 id    cash   dummy_missing
1     5      0
1     5      0
1     5      0
2     2      0
2     NaN    1
  

И это должно выглядеть примерно так:

 id    cash    dummy_missing
1     5      0
1     6      0
1     7      0
2     2      1
2     NaN    1
  

Спасибо

Комментарии:

1. Вероятно, вы могли бы сделать это в своем SQL-запросе, чтобы сохранить постобработку.

2. Спасибо, я никогда не работал с SQL, но я прочитал об этом сегодня и подумал, что это может быть полезно, поэтому я включил это в теги, но я не знаю, что означает то, что вы сказали.

3. Если вы на самом деле не используете SQL для извлечения этих данных, то проигнорируйте этот комментарий, но вам также следует удалить тег из вашего вопроса.

4. Я включил его, потому что я был бы признателен за ответ с использованием SQL, поскольку я открыт для изучения того, как его использовать. Но ответ без SQL тоже подойдет. Если это неправильное использование тегов, пожалуйста, дайте мне знать.

Ответ №1:

Вы могли бы проверить, где есть NaNs с isna , groupby id и преобразовать с any :

 df['dummy_missing'] = df.cash.isna().groupby(df['id']).transform('any').view('i1')
  

 print(df)
   id  cash  dummy_missing
0   1   5.0              0
1   1   5.0              0
2   1   5.0              0
3   2   2.0              1
4   2   NaN              1
  

Ответ №2:

Используйте Series.isin для проверки id , если cash значения отсутствуют, и в последний раз преобразуйте логическую маску в целые числа для отображения True, False в 1,0 :

 df['dummy_missing'] = df['id'].isin(df.loc[df.cash.isna(), 'id']).astype(int)
print (df)
   id  cash  dummy_missing
0   1   5.0              0
1   1   5.0              0
2   1   5.0              0
3   2   2.0              1
4   2   NaN              1
  

Комментарии:

1. Спасибо за ответ, я проверил скорость вашего ответа по сравнению с ответом yatu, и ответ yatu примерно на 40% быстрее. Вот почему я принял его ответ.

2. @Olivier — Хммм, ты уверен? Я думаю, что решение not groupby должно быть быстрее.

3. @Olivier — Это было протестировано на реальных данных? Сколько реальных групп? Сколько строк? Каков процент групп с отсутствующими значениями?

4. да, с реальными данными, 8134 реальными группами, 1.455.223 строками, примерно 99.67% групп имеют отсутствующее значение.

5. @Olivier — Я думаю, что нет.