我正在尝试连接2个DataFrame,但.join正在创建不需要的重复。
df_ask:
timestamp price volume
1520259290 10.5 100
1520259275 10.6 2000
1520259275 10.55 200
df_bid:
timestamp price volume
1520259290 10.25 500
1520259280 10.2 300
1520259275 10.1 400
我试过了:
depth = pd.concat([df_ask,df_bid], axis=1, keys=['Ask Orders','Bid Orders'])
但是这会返回一个我理解的错误(" concat失败重构索引仅对具有唯一值的索引对象有效并且#34;)
我试过了:
df_ask.join(df_bid, how='outer', lsuffix='_ask', rsuffix='_bid')
哪个没有错误,但提供了以下数据框:
timestamp price_ask volume_bid price_bid volume_bid
1520259290 10.5 100 10.25 500
1520259280 NaN NaN 10.2 300
1520259275 10.6 2000 10.1 400
1520259275 10.55 200 10.1 400
我的问题是在时间戳1520259275处重复的10.1和400.它们不在原始df_bid数据帧中两次,并且应该只在此df中一次。具有相同时间戳的两行是正确的,因为此时有两个询问行,但是应该只有一个与该时间戳相关联的出价信息行。另一个应该是NaN。
即我正在寻找的是:
timestamp price_ask volume_bid price_bid volume_bid
1520259290 10.5 100 10.25 500
1520259280 NaN NaN 10.2 300
1520259275 10.6 2000 10.1 400
1520259275 10.55 200 NaN NaN
我查看了merge / join / concat文档和this question,但我无法找到我正在寻找的内容。提前致谢
答案 0 :(得分:1)
您隐式假设索引的第一个实例应与索引的另一个第一个实例对齐。在这种情况下,使用groupby
+ cumcount
来建立每个唯一索引的排序。
df_ask = df_ask.set_index(df_ask.groupby('timestamp').cumcount(), append=True)
df_bid = df_bid.set_index(df_bid.groupby('timestamp').cumcount(), append=True)
df_ask.join(df_bid, how='outer', lsuffix='_ask', rsuffix='_bid')
price_ask volume_ask price_bid volume_bid
timestamp
1520259275 0 10.60 2000.0 10.10 400.0
1 10.55 200.0 NaN NaN
1520259280 0 NaN NaN 10.20 300.0
1520259290 0 10.50 100.0 10.25 500.0