Pandas 没有重复的外连接添加新行
Pandas outer join with no duplicates adds new rows
我有 2 个数据帧 preds
和 assets_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,在这种情况下相等性检查将通过。
我有 2 个数据帧 preds
和 assets_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,在这种情况下相等性检查将通过。