是否可以在数据帧中执行动态“ where / filter”? 我正在执行“喜欢”操作,以删除与特定字符串匹配的项目
eventsDF.where(
~eventsDF.myColumn.like('FirstString%') &
~eventsDF.myColumn.like('anotherString%')
).count()
但是我需要基于来自另一个数据框/列表的字符串进行过滤。
我要使用的解决方案(实际上不起作用)涉及一个接收索引的函数
#my_func[0] = "FirstString"
#my_func[1] = "anotherString"
def my_func(n):
return str(item[n])
newDf.where(
~newDf.useragent.like(str(my_func(1))+'%')
).count()
但是我正在努力通过传递一个范围来使其工作(主要是因为它是一个列表而不是整数)
newDf.where(
~newDf.useragent.like(str(my_func([i for i in range(2)])+'%'))
).count()
我不想沿着使用“ exec”或“ eval”执行它的路径
答案 0 :(得分:2)
str_likes = [~df.column.like(s) for s in strings]
然后将其简化为一个表达式reduce(lambda x, y: x & y, str_likes)
这有点丑陋,但是可以满足您的要求。您也可以像这样在for循环中执行此操作
bool_expr = ~df.column.like(strings[0])
for s in strings[1:]:
bool_expr &= ~df.column.like(s)
df.where(bool_expr).count()