Удалить строки, если группа содержит пустой столбец - PullRequest
0 голосов
/ 04 июля 2018

У меня есть несколько строк в моем фрейме данных и столбец с именем 'name'.

Я хочу сгруппировать 'name' и удалить каждый элемент в группе, если в какой-либо строке есть пустой столбец (или nan, none или пустая строка).

Как мне этого добиться?

Input

       name    c0  c1  c2
193556   INFO    1       
273142    OMN    1  1   1
256278    OMN    1  1   1
41165    INFO    1  1   1
339649   INFO    1  1   1

выход

       name    c0  c1  c2
273142    OMN    1  1   1
256278    OMN    1  1   1

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Для повышения производительности не используйте groupby, лучший способ - получить все имена по условию и отфильтровать по isin:

Если пустое значение NaN, вам нужно только изменить == '' на .isnull().

names = df.loc[(df.iloc[:, 1:] == '').any(axis=1), 'name']
#alternative
#names = df.loc[(df.drop('names', axis=1) == '').any(axis=1), 'name']

df = df[~df['name'].isin(names)]
print (df)
       name  c0 c1 c2
273142  OMN   1  1  1
256278  OMN   1  1  1

Деталь

Проверить все значения без первого столбца по условию:

print ((df.iloc[:, 1:] == ''))
           c0     c1     c2
193556  False   True   True
273142  False  False  False
256278  False  False  False
41165   False  False  False
339649  False  False  False

Проверьте, есть ли хотя бы один True на столбец с any:

print ((df.iloc[:, 1:] == '').any(axis=1))
193556     True
273142    False
256278    False
41165     False
339649    False
dtype: bool

Получить имена, фильтруя столбец name:

print (df.loc[(df.iloc[:, 1:] == '').any(axis=1), 'name'])
193556    INFO
Name: name, dtype: object
0 голосов
/ 04 июля 2018

Вы можете использовать filter, проверяя, существует ли в группе пустое значение ("") и фильтруя по этому условию:

import pandas as pd

df.groupby('name').filter(lambda x: (x != "").all().all())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...