pandas.merge:两侧具有重复键的外连接会产生笛卡尔积

问题描述 投票:0回答:3

我有 2 个系列,

bids
asks
,已按时索引。

一些时间戳重复,表明价格已更新多次,但时间戳分辨率太大,无法捕获差异。

                                     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

bids
asks
中存在相同的时间戳时,每个行都有各自的值:

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,A
A,B
B,A
B,B
):

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

我想要的是只有 2 行(

A,A
B,B
):

2018-06-15 06:00:09.977950+00:00  3525.0  3526.0
2018-06-15 06:00:09.977950+00:00  3526.0  3527.0

这可能吗?

python pandas outer-join cartesian-product full-outer-join
3个回答
0
投票

您可以使用

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


0
投票

你可以尝试使用

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

0
投票

将 pandas 数据帧与键重复项合并中给出的答案来看,似乎最好的方法是创建一个附加键列,该键列仅用作任意索引,以使外连接合并第一行的第 n 行DataFrame 与第二个 DataFrame 的第 n 行(对于每个原始键):

df1['cc'] = df1.groupby('key').cumcount()
df2['cc'] = df2.groupby('key').cumcount()
df1.merge(df2, how='outer', on=["key", "cc"]).drop('cc', 1)
© www.soinside.com 2019 - 2024. All rights reserved.