我的数据框中有多行,还有一个名为“名称”的列。
我想对“名称”进行分组,并删除组中的所有项目(如果有任何行具有空列(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
答案 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