假设我有一个带有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,则将该新元素添加到另一个列表中。
答案 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]