我正在撰寫一個函式來輸出一個具有兩個資料幀之間差異的資料幀。簡化后,這看起來像這樣:
differences = df1.join(df2, df1['id'] == df2['id'], how='full') \
.select(F.coalesce(df1['id'], df2['id']).alias('id'), df1['name'], df2['name'])
.where(df1['name'] != df2['name'])
使用以下 2 個資料集,我希望第 3 個資料集是輸出:
--- -----
| id| name|
--- -----
| 1|Alice|
| 2| Bob|
| 3|Carol|
| 4| Dan|
| 5| Eve|
--- -----
--- -----
| id| name|
--- -----
| 1|Alice|
| 2| Ben|
| 4| Dan|
| 5| Eve|
| 6| Finn|
--- -----
--- ------- -------
|age| name| name|
--- ------- -------
| 2| Bob| Ben|
| 3| Carol| null|
| 6| null| Finn|
--- ------- -------
但是當我在資料塊中運行它時,結果資料框中會省略空列。
--- ------- -------
|age| name| name|
--- ------- -------
| 2| Bob| Ben|
--- ------- -------
它們不被 where 子句視為 != 嗎?創建這些框架時是否有隱藏的邏輯?
uj5u.com熱心網友回復:
從為什么 [table].[column] != null 不起作用?:
“資料庫中的 NULL 不是一個值。它意味著諸如“未知”或“資料丟失”之類的東西。
你無法判斷你沒有任何資訊的東西是否等于你也沒有任何關于 (=, != 運算子) 的任何資訊的東西。但是你可以說是否有任何可用的資訊(IS NULL,IS NOT NULL)。”
因此,您將不得不添加更多條件:
differences = df1.join(df2, df1['id'] == df2['id'], how='full')\
.select(F.coalesce(df1['id'], df2['id']).alias('id'), df1['Name'], df2['Name'])\
.where((df1['Name'] != df2['Name']) | ((df1['Name']).isNull() | (df2['Name']).isNull()))
--- ----- ----
|id |Name |Name|
--- ----- ----
|2 |Bob |Ben |
|3 |Carol|null|
|6 |null |Finn|
--- ----- ----
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/349857.html
上一篇:如何根據列值修改資料框
