Удаление группы строк, если в одном столбце отсутствуют данные в фрейме данных pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть следующий фрейм данных:

 df

          Group       Dist
    0     A             5
    1     B             2
    2     A             3
    3     B             1
    4     B             0
    5     A             5
 

Я пытаюсь удалить все строки, которые совпадают Group , если Dist столбец равен нулю. Это работает для удаления строки 4:

 df = df[df.Dist != 0]
 

однако я также хочу удалить строки 1 и 3, поэтому у меня остается:

 df
          Group       Dist
    0     A             5
    2     A             3
    5     A             5
 

Есть идеи о том, как удалить группу на основе этого условия?

Спасибо!

Ответ №1:

Сначала получите все Group значения для Entry == 0 , а затем отфильтруйте их, проверив столбец Group с инвертированной маской по ~ :

 df1 = df[~df['Group'].isin(df.loc[df.Dist == 0, 'Group'])]
print (df1)
  Group   Dist
0     A      5
2     A      3
5     A      5
 

Или вы можете использовать GroupBy.transform with GroupBy.all для проверки, если groups не имеет 0 значений:

 df1 = df[(df.Dist != 0).groupby(df['Group']).transform('all')]
 

РЕДАКТИРОВАТЬ: для удаления всех групп с отсутствующими значениями:

 df2 = df[df['Dist'].notna().groupby(df['Group']).transform('all')]
 

Для проверки отсутствующих значений:

 print (df[df['Dist'].isna()])
 

если ничего не возвращать, пропущенных значений нет NaN или нет None , как Nonetype .

Так можно проверить скалярность, например, если это значение находится в строке с индексом 10 :

 print (df.loc[10, 'Dist'])
print (type(df.loc[10, 'Dist']))
 

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

1. Извините @jezrael, я просто исправил описание в Dist качестве заголовка

2. @SOK — Нет проблем, переименован тоже 😉

3. будет ли это также работать в dropna функции. НАПРИМЕР df.dropna(subset=['Dist']).groupby(df['Group']).transform('all') ?

4. @SOK — Нужно ли проверять, нет ли пропущенных значений для каждой группы? затем используйте df['Dist'].notna().groupby(df['Group']).transform('all')

5. Ах да, идеально. Мне просто нужно удалить все строки в группе, если есть na

Ответ №2:

Вы можете использовать groupby и метод filter :

 df.groupby('Group').filter(lambda x: x['Dist'].ne(0).all())
 

Вывод:

   Group  Dist
0     A     5
2     A     3
5     A     5
 

Если вы хотите отфильтровать группы с отсутствующими значениями:

 df.groupby('Group').filter(lambda x: x['Dist'].notna().all())
 

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

1. Спасибо! Я попробовал приведенный ниже ответ, и он сработал. Как вы думаете, могу ли я адаптировать это для na значений?

2. удаление Group строк Dist , если na

3. Используйте x['Dist'].notna().all() вместо этого.