避免数据帧concat / merge / join中的重复数据

时间:2018-03-05 14:57:56

标签: python python-3.x pandas dataframe concatenation

我正在尝试连接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,但我无法找到我正在寻找的内容。提前致谢

1 个答案:

答案 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