pandas.merge:外部连接,两边都有重复的键,结果形成笛卡尔积

时间:2019-07-14 21:52:15

标签: python pandas outer-join cartesian-product full-outer-join

我有两个系列,bidsasks,均按时编入索引。

某些时间戳重复,表示价格已多次更新,但时间戳分辨率太大,无法捕捉到差异。

                                     bids
2018-06-15 06:00:04.129817+00:00  3525.0
2018-06-15 06:00:04.281829+00:00  3526.0
2018-06-15 06:00:05.417908+00:00  3525.0
2018-06-15 06:00:06.537999+00:00  3526.0
2018-06-15 06:00:09.977950+00:00  3525.0 \___ duplicate timestamps
2018-06-15 06:00:09.977950+00:00  3526.0 /
2018-06-15 06:00:12.674419+00:00  3525.0

                                    asks
2018-06-15 06:00:04.129817+00:00  3526.0
2018-06-15 06:00:04.281829+00:00  3527.0
2018-06-15 06:00:05.417908+00:00  3526.0
2018-06-15 06:00:05.485926+00:00  3527.0 \___ duplicate timestamps
2018-06-15 06:00:05.485926+00:00  3526.0 /
2018-06-15 06:00:06.537999+00:00  3527.0
2018-06-15 06:00:09.977950+00:00  3526.0 \___ duplicate timestamps
2018-06-15 06:00:09.977950+00:00  3527.0 /
2018-06-15 06:00:12.674419+00:00  3526.0
2018-06-15 06:00:17.333349+00:00  3527.0

我想将这两个系列合并到一个数据框中。我将pandas.merge与外部联接一起使用,并将两个系列的索引用作合并键:

>>> pandas.merge(bids, asks, how='outer', left_index=True, right_index=True)
                                    bids    asks
2018-06-15 06:00:04.129817+00:00  3525.0  3526.0
2018-06-15 06:00:04.281829+00:00  3526.0  3527.0
2018-06-15 06:00:05.417908+00:00  3525.0  3526.0
2018-06-15 06:00:05.485926+00:00     NaN  3527.0
2018-06-15 06:00:05.485926+00:00     NaN  3526.0
2018-06-15 06:00:06.537999+00:00  3526.0  3527.0
2018-06-15 06:00:09.977950+00:00  3525.0  3526.0
2018-06-15 06:00:09.977950+00:00  3525.0  3527.0
2018-06-15 06:00:09.977950+00:00  3526.0  3526.0
2018-06-15 06:00:09.977950+00:00  3526.0  3527.0
2018-06-15 06:00:12.674419+00:00  3525.0  3526.0
2018-06-15 06:00:17.333349+00:00     NaN  3527.0

bidsasks中都存在相同的时间戳记时,将在一行中分别包含各自的值:

2018-06-15 06:00:04.129817+00:00  3525.0  3526.0

如果仅在一侧存在重复的时间戳记,那么重复的结果将导致添加相同数量的行,而另一侧具有NaN值:

2018-06-15 06:00:05.485926+00:00     NaN  3527.0
2018-06-15 06:00:05.485926+00:00     NaN  3526.0

但是,当两边都存在重复的时间戳记时,我会得到多行,两边的值都是笛卡尔积(例如:A,AA,BB,A,{{ 1}}):

B,B

我只希望有2行(2018-06-15 06:00:09.977950+00:00 3525.0 3526.0 2018-06-15 06:00:09.977950+00:00 3525.0 3527.0 2018-06-15 06:00:09.977950+00:00 3526.0 3526.0 2018-06-15 06:00:09.977950+00:00 3526.0 3527.0 A,A):

B,B

这可能吗?

2 个答案:

答案 0 :(得分:0)

您可以使用DataFrame.duplicated根据您的时间戳列查找重复的行,并向重复项添加1微秒以创建不同的行

答案 1 :(得分:0)

您可以尝试

df1.reset_index().merge(df2.reset_index(),on='index',how='outer')