无重复的 Pandas 外连接添加新行
Posted
技术标签:
【中文标题】无重复的 Pandas 外连接添加新行【英文标题】:Pandas outer join with no duplicates adds new rows 【发布时间】:2021-09-17 14:15:54 【问题描述】:我有 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
这怎么可能?两个数据帧都没有这个值。我还确保两个数据框中没有重复的行。有人可以解释一下吗?
【问题讨论】:
您可以删除.astype("asset_id": "int64"
并重复您的检查吗?我怀疑在您原来的 df 中,asset_id 列不是int64
。您可以通过preds.info()
查询
【参考方案1】:
在合并之前检查数据帧上asset_id的数据类型,在这两种情况下都是int64吗?
在您与数值 57412518735315968 进行比较之前,可能会出现此问题,如果原始数据帧中的类型不是 int64,而是对象,那么您的相等性检查将不会返回匹配的行。
在合并步骤中,您将asset_id的数据类型显式更改为int64,在这种情况下,相等性检查将通过。
【讨论】:
以上是关于无重复的 Pandas 外连接添加新行的主要内容,如果未能解决你的问题,请参考以下文章