我正在尝试连接 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'])
但这会返回一个我确实理解的错误(“连接失败重新索引仅对具有唯一值的索引对象有效”)
我尝试过:
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但我找不到我要找的东西。提前致谢
最佳答案
您隐含地假设索引的第一个实例应与索引的另一个第一个实例对齐。在这种情况下,请使用 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
关于python - 避免数据帧中的重复数据连接/合并/连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49113254/