Pandas更有效的方法来过滤包含空字段的组?

时间:2017-06-02 16:36:57

标签: python pandas

我目前正在尝试过滤掉包含空字段的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

2 个答案:

答案 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。