【问题标题】:Comparing Pandas Dataframe Rows & Dropping rows with overlapping dates比较 Pandas 数据框行和删除具有重叠日期的行
【发布时间】:2013-10-16 16:59:40
【问题描述】:

我有一个数据框,其中包含从交易策略中提取的交易。交易策略中的逻辑需要更新,以确保如果策略已经在交易中,则不会进行交易 - 但这是一个不同的问题。许多先前交易的交易数据从 csv 文件读入数据框。

对于我拥有的数据,这是我的问题: 我需要对数据帧进行逐行比较,以确定 rowX 的 Entrydate 是否小于 ExitDate rowX-1。

我的数据样本:

Row 1:
EntryDate  ExitDate
2012-07-25 2012-07-27 

Row 2:
EntryDate  ExitDate
2012-07-26 2012-07-29

需要删除第 2 行,因为这是不应该发生的交易。

我无法确定哪些行是重复的,然后将它们删除。我幸运地尝试了approach in answer 3 of this question,但这并不理想,因为我必须手动遍历数据框并读取每一行的数据。我目前的方法如下,并且很丑陋。我检查日期,然后将它们添加到新的数据框中。此外,这种方法在最终数据帧中给了我多个重复项。

for i in range(0,len(df)+1):
    if i+1 == len(df): break #to keep from going past last row
    ExitDate = df['ExitDate'].irow(i)
    EntryNextTrade = df['EntryDate'].irow(i+1)

    if EntryNextTrade>ExitDate: 
        line={'EntryDate':EntryDate,'ExitDate':ExitDate}
        df_trades=df_trades.append(line,ignore_index=True)

关于如何更有效地完成此任务的任何想法或想法?

如果您想尝试重现我的实际数据帧,您可以click here 查看我的数据样本。

【问题讨论】:

  • avoid 避免 for 循环!
  • 是的。我知道...但这是我开始的唯一方法:)

标签: python pandas


【解决方案1】:

您应该使用某种布尔掩码来执行此类操作。

一种方法是为下一笔交易创建一个虚拟列:

df['EntryNextTrade'] = df['EntryDate'].shift()

使用它来创建面具:

msk = df['EntryNextTrade'] > df'[ExitDate']

并使用 loc 查看 msk 为 True 的 subDataFrame,并且只查看指定的列:

df.loc[msk, ['EntryDate', 'ExitDate']]

【讨论】:

  • 谢谢。现在尝试一下。我知道我可以使用一些简单的东西。
  • 这非常有效。非常感谢,由于是新人,我不能投票,但如果可以的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 2017-12-07
  • 1970-01-01
相关资源
最近更新 更多