#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()
вместо этого.