无重复的 Pandas 外连接添加新行

Posted

技术标签:

【中文标题】无重复的 Pandas 外连接添加新行【英文标题】:Pandas outer join with no duplicates adds new rows 【发布时间】:2021-09-17 14:15:54 【问题描述】:

我有 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

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

【问题讨论】:

您可以删除.astype("asset_id": "int64" 并重复您的检查吗?我怀疑在您原来的 df 中,asset_id 列不是int64。您可以通过preds.info() 查询 【参考方案1】:

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

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

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

【讨论】:

以上是关于无重复的 Pandas 外连接添加新行的主要内容,如果未能解决你的问题,请参考以下文章

pandas - 带有外连接的 DataFrame 扩展

使用包含的左外连接 Pandas 数据框

只外连接 python pandas

Pandas - 具有重复值的列的外部连接

使用 pandas.merge_asof 进行完全外连接

Pandas 映射 2 个数据帧中的值和外连接 + 聚合值