使用函数过滤pandas数据帧

时间:2017-12-14 04:12:51

标签: python pandas dataframe

假设我有一个带有df列的pandas数据帧A, B, C, D, E, F, G, H,我想使用一个带有"行"的函数functn来过滤数据帧。并根据行是否满足某些条件返回true或false(假设函数使用除H之外的所有列)。有没有办法有效地过滤这个数据帧而没有长而丑陋的lambda?到目前为止我的解决方案看起来像这样:

df = df[df.apply(functn, axis=1)]

但是这种方法看起来非常慢,即使对于15k行的帧也是如此。有没有一种干净有效的方法来使用用户定义的python函数而不是lambda或查询来过滤pandas数据框?

注意:我之前使用普通的python 2d数组实现了它,它比使用pandas快得多。我是否滥用某个功能或者没有意识到使这种过滤过程更快的方法?

编辑:

数据的结构大致如下:

#       A       B       C     D     E     F      G        H      
[
    [string1, string2, int1, int2, int3, int4, float1, float2], 
    ...
]

该功能的功能如下:

def filter(row):
    var1 = row.G <= 0.01
    partial_a = (((row.D - row.C + 1)*1.0)/global_map[row.A])
    partial_b = (((row.F - row.E + 1)*1.0)/global_map[row.B])
    partial = partial_a >= 0.66 or partial_b >= 0.66
    return var1 and partial

非pandas实现基本上采用了数据帧,如果不是pandas形式,基本上是一个2d数组,并循环遍历每个元素,将函数应用于它(除了参数是一个列表而不是&#34; row&#34;),如果返回true,则将该新元素添加到另一个列表中。

1 个答案:

答案 0 :(得分:3)

IIUC,你不需要一个功能。让我们使用布尔索引如下:

cond1 = df['G'] <= 0.01
cond2 = (((df.D - df.C + 1)*1.0)/global_map[df.A]) >= 0.66
cond3 = (((df.F - df.E + 1)*1.0)/global_map[df.B]) >= 0.66

mask = cond1 & (cond2 | cond3)

df[mask]