如果组包含空列,则删除行

时间:2018-07-04 09:59:46

标签: python pandas dataframe pandas-groupby

我的数据框中有多行,还有一个名为“名称”的列。

我想对“名称”进行分组,并删除组中的所有项目(如果有任何行具有空列(nan,none或空字符串))。

我该如何实现?

输入

       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 :(得分:2)

您可以使用filter,检查组中是否存在空值("")并根据该条件进行过滤:

import pandas as pd

df.groupby('name').filter(lambda x: (x != "").all().all())

答案 1 :(得分:1)

为了获得更好的性能,请不要使用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的{​​{1}}:

any

通过过滤print ((df.iloc[:, 1:] == '').any(axis=1)) 193556 True 273142 False 256278 False 41165 False 339649 False dtype: bool 列获取名称:

name