我有 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
这可能吗?
您可以使用
DataFrame.duplicated
根据时间戳列查找重复行,并向重复行添加 1 微秒以创建不同的行
你可以尝试使用
df1.reset_index().merge(df2.reset_index(),on='index',how='outer')
从将 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)