我目前正在尝试过滤掉包含空字段的pandas中的组。我这样做是通过遍历所有组来实现的。
for _, g in df.groupby(['name', 'group']):
if not (g['val'].isnull()).any()
#Do more stuff with group, as none of its records are null
然而,这是非常低效的,并且已成为我的代码的核心瓶颈。有没有办法表示这种行为而不需要迭代每个组,这个数据帧非常大。
编辑:
只需在groupby之前删除空记录就无法实现此行为。 groupby用于区分可接受的组。如果您事先删除了所有空记录,那么所有组都将通过,这是不可取的。
基本上我正在尝试解决这个问题,为每个组,确保它不包含空记录,如果它丢弃整个组,而不仅仅是记录本身 的
编辑2:
这是一个更具体的例子,因为它不符合性能的大小。
import pandas
import numpy
df = pandas.DataFrame([{'name': 'alpha', 'group': 1, 'val': 100}, {'name': 'alpha', 'group': 1, 'val': numpy.nan},
{'name': 'alpha', 'group': 1, 'val': 50}, {'name': 'beta', 'group': 1, 'val': 20}, {'name': 'beta', 'group': 1, 'val': 40},
{'name': 'beta', 'group': 2, 'val': numpy.nan}, {'name': 'beta', 'group': 2, 'val': 120}])
print df
group name val
0 1 alpha 100.0
1 1 alpha NaN
2 1 alpha 50.0
3 1 beta 20.0
4 1 beta 40.0
5 2 beta NaN
6 2 beta 120.0
for _, g in df.groupby(['name', 'group']):
if not (g['val'].isnull()).any():
print g
group name val
3 1 beta 20.0
4 1 beta 40.0
答案 0 :(得分:3)
filter
within the groupby
上下文需要callable
返回bool
,以确定是否包含该组。我这样做:
# Truth values across whole grouped dataframe on what pandas thinks is null
# \ ______
# / \
df.groupby(['name', 'group']).filter(lambda df: df.notnull().values.all())
# \________/
# /
# Letting numpy determine if everything in the 2-D array is True
答案 1 :(得分:1)
您不需要迭代。只需使用df.isnull()。它将返回一个布尔值的DataFrame。