【问题标题】:Avoiding duplicate data in a dataframe concat/merge/join避免数据框中的重复数据 concat/merge/join
【发布时间】:2018-08-13 06:33:23
【问题描述】:

我正在尝试连接 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 failed Reindexing only valid with unique value Index objects”)

我试过了:

 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,但找不到我要查找的内容。提前致谢

【问题讨论】:

  • 您使用Time 作为索引...而且它不是唯一的。我不明白你想要什么。请编辑您的帖子并展示您的想法。
  • @piRSquared 正确。 Time 不会是独一无二的。顺便说一句,我将索引更改为 timestamp 以减少混乱。我已更新问题以显示我在寻找什么。

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


【解决方案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

【讨论】:

  • 是的!有效,但确实在我能够摆脱的索引中添加了一个计数列:df.reset_index(inplace=True)df.drop(df.columns[1], axis=1, inplace=True)df.set_index('timestamp',inplace=True)df.sort_index(axis=0, inplace=True)
猜你喜欢
  • 1970-01-01
  • 2019-03-09
  • 2020-07-15
  • 2013-01-31
  • 2016-04-17
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多