gpt4 book ai didi

python - 如何检查多列以匹配正则表达式规则以在 PySpark 的另一列中输出

转载 作者:行者123 更新时间:2023-12-02 15:46:09 24 4
gpt4 key购买 nike

我的数据框:

enter image description here

我必须检查每列中的值是否符合特定规则。例如:

  • 如果“a”列有一个数字,“b”列有 xx 或 yy,“c”列有 1 或 2,而“d”列有 0 -> 那么输出应该是“output1”
  • 没有必要所有的列都应该有规则。如果规则不存在,那么它应该简单地忽略它。例如,对于“output3”,“c”列中的内容无关紧要。
  • 如果它不匹配任何规则,它应该说“找不到匹配项”。

由于规则太多,我创建了一个正则表达式规则字典如下:

rules_dict = 
{'output1': {'a': '^[0-9]*$',
'b': 'xx | yy',
'c': '^[1-2]*$',
'd': '0'},

'output2': {'a': '^[a-z]+$',
'b': 'xx | yy',
'c': '1',
'd': '0'},

'output3': {'a': '^[a-zA-Z0-9_.-]*$',
'b': 'xx | yy',
'd': '0'},

'output4': {'a': '^[0-9]*$',
'b': 'xx | yy',
'c': '^[1-2]*$',
'd': '0'}
}

预期输出:

enter image description here

我使用了以下 PySpark 脚本:

for out in rules_dict.keys():
for column, rule in rules_dict[out].items():
output_df = df.withColumn('output', F.when(df[column].rlike(rule), out).otherwise('no matches found'))
output_df.show()

但是输出是:

enter image description here

P.S:我正在为一个包含大量规则的大型数据集做这件事。我只创建了一个示例来简化问题。

最佳答案

@ZygD 的回答非常好,但您也可以使用一些理解和函数工具,这样您就不必 for 遍历配置。其他区别是我使用 coalesce 来获得第一个非空结果:

df.withColumn("output", F.coalesce(
*[
F.when(
functools.reduce(lambda x, y: x & y, [F.col(column).rlike(rule) for column, rule in rules_dict[out].items()]),
F.lit(out)
)
for out in rules_dict.keys()
],
F.lit('no matches found')
)).show()

关于python - 如何检查多列以匹配正则表达式规则以在 PySpark 的另一列中输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74141523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com