無論哪種方式,Pandas 或 PySpark 中的解決方案都很好,我對邏輯很感興趣。
我有兩個資料框:
df_1 =
id_1 id_2 value
ABC XYZ AA
ABA XYY null
ABD YYZ null
ABD ZYZ A
ABB XYY AA-
ACC XZY A--
BBB YYY null
df_2 =
id_1 id_2 value
ABC XYZ AA
ABA XYY CCC
ABD YYZ UNDEF
ABD ZYZ A-
ABB XYY AA-
我如何檢查每一對id_1和id_2in df_2,這對存在于df_1并具有相同的value?我想跟蹤不匹配的有問題的行:
expected_output =
id_1 id_2 value value_actual
ABA XYY null CCC
ABD YYZ null UNDEF
ABD ZYZ A A-
我讓自己過于復雜,因為我最初想要一個可以檢查多個屬性的結果并做了:
def matching_spark(df_1, df_2):
df_1 = df_1.withColumn('index', row_number().over(Window.partitionBy().orderBy('id_1','id_2')))
df_2 = df_2.withColumn('index', row_number().over(Window.partitionBy().orderBy('id_1','id_2')))
s = df_1.unionByName(df_2).orderBy('id_1','id_2','index')
s = s.withColumn('change',array('value'))
s = s.withColumn('cols',split(lit('value'),'\,'))
s= s.withColumn('change1',last('change').over(Window.partitionBy('index').orderBy('id_1','id_2'))).where(col('change')!=col('change1'))
s = s.withColumn('change2', expr("transform(change,(c,i)->change[i]!=change1[i])")).withColumn('faulty_attr',expr('filter(cols,(x,j)->(change2[j]))')).drop('index','change','cols','change1' ,'change2')
return s
但是什么都沒有出現,我相信我上面的例子有一個簡單的加入解決方案。
uj5u.com熱心網友回復:
merge和過濾器:
(df1.merge(df2, on=['id_1', 'id_2'], suffixes=(None, '_actual'))
.query('value != value_actual')
)
輸出:
id_1 id_2 value value_actual
1 ABA XYY NaN CCC
2 ABD YYZ NaN UNDEF
3 ABD ZYZ A A-
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515053.html
上一篇:將大量列附加到1列中
