Pandas 没有重复的外连接添加新行

Pandas outer join with no duplicates adds new rows

我有 2 个数据帧 predsassets_to_remove

这是数据框 preds 的样子:

               asset_id        asset_name
294771  493646671302244         queue_bar
294770  503848157271852   refactor_target
294769  786314528522899   submission_tray
294768  206472013793428  state_subscriber
294767  510707746509671         format_gk
...                 ...               ...
4       688122571800214          v2_reads
3       323798285353466 products_v2_reads
2       395943214896870   update_protocol
1       680526449474908          fix_v153
0       349458202857963   adjustment_v159

[294772 rows x 2 columns]

这是数据框 assets_to_remove 的样子:

            asset_id
0    513454469563578
1    829695400866900
2    764696234441014
3    195100021778259
4    368797654574209
..               ...
20   237207674121701
21   135774837852816
22  2453638234940010
23   705229516884471
24   343619773239104

[1995 rows x 1 columns]

这两个数据帧中都没有 asset_id 等于 57412518735315968 的行。 正在检查 preds

print(preds[preds.asset_id.eq(57412518735315968)])
Empty DataFrame
Columns: [asset_id, asset_name]
Index: []

正在检查assets_to_remove

print(assets_to_remove[assets_to_remove.asset_id.eq(57412518735315968)])
Empty DataFrame
Columns: [asset_id]
Index: []

现在我对这两个数据帧进行外部连接:

z = pd.merge(preds,assets_to_remove,on="asset_id",how="outer",indicator="source").astype({"asset_id": "int64"})

给出这样的结果数据框:


                asset_id  ...      source
0        493646671302244  ...   left_only
1        503848157271852  ...   left_only
2        786314528522899  ...   left_only
3        206472013793428  ...   left_only
4        510707746509671  ...   left_only
...                  ...  ...         ...
296016   743251236547292  ...  right_only
296017   890822734697339  ...  right_only
296018   274927503757939  ...  right_only
296019   943962539702954  ...  right_only
296020  2453638234940010  ...  right_only

[296021 rows x 3 columns]

此数据框包含资产 ID 为 57412518735315968 的行!

print(z[z.asset_id.eq(57412518735315968)])
                 asset_id                             asset_name     source
216128  57412518735315968  storefront_ig_new_menu_items_internal  left_only

这怎么可能?两个数据帧都没有这个值。我还确保两个数据框中没有重复的行。有人可以解释一下吗?

在合并之前检查数据帧上 asset_id 的数据类型,两种情况下都是 int64 吗?

这个问题可能发生在您与数值 57412518735315968 进行比较的合并之前,如果原始数据帧中的类型不是 int64,而是对象,那么您的相等性检查将不会返回匹配的行。

在合并步骤中,您明确将 asset_id 的数据类型更改为 int64,在这种情况下相等性检查将通过。