我想根据某些规则来验证DataFrame
,该规则包含另一个名为Rule的DataFrame
。
在规则DataFrame
的基础上验证输入DataFrame
的最佳方法是什么,如果适用于多个规则的任何行检查,则仅获得最高优先级的验证并提供如下数据:
输入数据框:
+---+----+----+-------+-------+-----+-----+-----+-----+
| Id|Name|City|Country|Pincode|flatA|flagB|flagC|flagD|
+---+----+----+-------+-------+-----+-----+-----+-----+
| 1| A| MUM| INDIA| 100010| null| Y| Y| null|
| 2| B| MUM| INDIA| 200020| null| null| Y| null|
| 3| C| MUM| INDIA| 100030| null| null| null| Y|
| 4| D| MUM| INDIA| 500050| Y| Y| null| null|
| 5| E| MUM| INDIA|3078787| null| null| Y| Y|
+---+----+----+-------+-------+-----+-----+-----+-----+
规则数据框:
+------+----+-------+-----+-----+-----+-----+-------+--------+
|Rules#|City|Country|flatA|flagB|flagC|flagD|Pincode|Priority|
+------+----+-------+-----+-----+-----+-----+-------+--------+
| 1| MUM| INDIA| null| Y| null| null| 100010| 3|
| 2| MUM| INDIA| null| null| Y| null| 200020| 4|
| 3| MUM| INDIA| null| null| null| Y| 300030| 6|
| 4| MUM| INDIA| null| Y| Y| null| 400040| 2|
| 5| MUM| INDIA| Y| Y| null| null| 500050| 1|
| 6| MUM| INDIA| null| null| Y| Y| 600060| 5|
+------+----+-------+-----+-----+-----+-----+-------+--------+
预期输出:
+---+----+----+-------+-------+-----+-----+-----+-----+--------------+-----------+
| Id|Name|City|Country|Pincode|flatA|flagB|flagC|flagD|ValidationFlag|New_PinCode|
+---+----+----+-------+-------+-----+-----+-----+-----+--------------+-----------+
| 1| A| MUM| INDIA| 100010| null| Y| Y| null| FALSE| 400040|
| 2| B| MUM| INDIA| 200020| null| null| Y| null| TRUE| 200020|
| 3| C| MUM| INDIA| 100030| null| null| null| Y| FALSE| 300030|
| 4| D| MUM| INDIA| 500050| Y| Y| null| null| TRUE| 500050|
| 5| E| MUM| INDIA|3078787| null| null| Y| Y| FALSE| 200020|
+---+----+----+-------+-------+-----+-----+-----+-----+--------------+-----------+
根据上面的示例,对于Id #1
中的Input Dataframe
,第1,2和4条规则均适用,但已选择了第4条规则按照优先级。
规则检查逻辑如下:
优先级2: Input.City == Rule.City AND Input.Country == Rule.Country AND Input.flagB == Y AND Input.flagC == Y
优先级3: Input.City == Rule.City AND Input.Country == Rule.Country AND Input.flagB == Y
优先级4: Input.City == Rule.City AND Input.Country == Rule.Country AND Input.flagC == Y
在AND条件下,应忽略Rule DataFrame中的任何空列
如果ValidationFlag
与Output DataFrame
列不匹配,则False
中新列new_PinCode
的值将为PinCode
,否则为True
。另一个新列new_PinCode
包含PinCode
,该Rule Dataframe
是根据优先级从"A" (root) {user A, user B, userC}
|
--- 'B' {user D, user E}
|
--- 'C' {user F, user G}
|
--- 'D' {user H, user I}
获得的。