pyspark - Pyspark - 数据框中的动态 where 子句
问题描述
是否可以在数据框中执行动态“位置/过滤器”?我正在运行“喜欢”操作以删除与特定字符串匹配的项目
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”执行它的路径
解决方案
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()
推荐阅读
- tcp - Kiali 仪表板中入站指标和出站指标的“报告来源”是什么意思?
- android - ERR_CLEARTEXT_NOT_PERMITTED
- python - 根据日期范围创建与 ID 匹配的新数据框
- php - 检查两个数组是否有相同的值
- java - 收缩数组在 Java 中维护数字分布
- qt - 向 QML 布局添加边距
- .net-core - .Net Core 1.1 程序集中的重复类型名称
- java - 如何在spring数据mongo db中聚合一个嵌套对象并避免PropertyReferenceException?
- c# - 在本地运行单元测试时缺少文件
- r - 将当前数据框重塑为另一个数据框并创建新列(连接)