Python 使用函数筛选数据帧

Python 使用函数筛选数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有一个数据帧df,其中有a、B、C、D、E、F、G、H列,我想用一个函数functn来过滤数据帧,该函数接受一行,并根据行是否满足某些条件返回true或false,比如说该函数使用除H之外的每一列。有没有一种方法可以有效地过滤这个数据帧而不使用长而难看的lambda?到目前为止,我的解决方案如下所示: df = df[df.apply(functn, axis=1)] # A B C D E F G H

假设我有一个数据帧df,其中有a、B、C、D、E、F、G、H列,我想用一个函数functn来过滤数据帧,该函数接受一行,并根据行是否满足某些条件返回true或false,比如说该函数使用除H之外的每一列。有没有一种方法可以有效地过滤这个数据帧而不使用长而难看的lambda?到目前为止,我的解决方案如下所示:

df = df[df.apply(functn, axis=1)]
#       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
但这种方法似乎非常慢,即使对于15k线的帧也是如此。是否有一种干净高效的方法可以使用用户定义的python函数而不是lambda或查询来过滤数据帧

注意:我以前使用普通的Python2D数组实现了这一点,它比使用pandas快得多。我是否误用了某个功能,或者不知道如何加快过滤过程

编辑:

数据的结构大致如下:

df = df[df.apply(functn, axis=1)]
#       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
该函数执行如下操作:

df = df[df.apply(functn, axis=1)]
#       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实现基本上采用dataframe,如果不是pandas形式,它基本上是一个2d数组,并循环通过每个元素,对其应用函数,除非参数是一个列表而不是一行,如果返回true,则将该新元素添加到另一个列表中

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]

如果您能提供示例数据,b fucntn的详细信息,c您使用的非熊猫实现,那么将更容易为您提供帮助。事实上,很难知道瓶颈在哪里。基准数据也不错。我将编辑原始帖子来反映这一点。谢谢@andrew_reece它应该更新!谢谢作为后续,是否有一种方法来概括此掩码,以便我可以将其应用于其他数据帧?我认为这是特定的,因为它引用了我提到的一个df。如果global_map是一个dict,您可能需要对查找进行矢量化,比如np.vectoriazeGlobal_map.getdf.a您应该能够将其编写为一个函数来生成掩码,然后将掩码应用于数据帧而无需循环。dict基本上只是查找表,他们不习惯将一大堆密钥塞进一个查找中。请看这篇文章了解更多选项:@ScottBoston整个python程序从3.894秒增加到0.376秒,因此大约是10倍的加速。