1

因此,假设我们正在查看市场数据更新。

 1. Bid 1 Ask 1.5
 2. Bid 1 Ask 1.5
 3. Bid 1 Ask 1.5
 4. Bid 1.5 Ask 2
 5. Bid 1.5 Ask 2
 6. Bid 2 Ask 2.5
 7. Bid 2 Ask 2.5
 8. Bid 2 Ask 3

我希望对此使用 drop_duplicates 以仅保留出价或要价更改的时间。我试过

df.drop_duplicates(cols=['Bid,Ask'])

但它并没有像我预期的那样出现。我想要在这个列表中的行为是将列表压缩成(假设数字是索引,所以保持索引)

 1. Bid 1 Ask 1.5
 4. Bid 1.5 Ask 2
 6. Bid 2 Ask 2.5
 8. Bid 2 Ask 3

因此,如果出价和要价都与之前的行相同,则会删除该行。

有什么明显的方法可以做到这一点吗?

4

2 回答 2

3

您可以使用.shift()移动一列,并使用any来检查差异。例如,给定一个像

>>> df
   Bid  Ask
1  1.0  1.5
2  1.0  1.5
3  1.0  1.5
4  1.5  2.0
5  1.5  2.0
6  2.0  2.5
7  2.0  2.5
8  2.0  3.0
>>> df[(df != df.shift()).any(axis=1)]
   Bid  Ask
1  1.0  1.5
4  1.5  2.0
6  2.0  2.5
8  2.0  3.0

一步一步,我们下移1:

>>> df.shift()
   Bid  Ask
1  NaN  NaN
2  1.0  1.5
3  1.0  1.5
4  1.0  1.5
5  1.5  2.0
6  1.5  2.0
7  2.0  2.5
8  2.0  2.5

我们将数据帧与其移位版本进行比较:

>>> df != df.shift()
     Bid    Ask
1   True   True
2  False  False
3  False  False
4   True   True
5  False  False
6   True   True
7  False  False
8  False   True

然后我们创建一个序列,只有当其中任何一个为真并且一行与下一行不同时才为真:

>>> (df != df.shift()).any(axis=1)
1     True
2    False
3    False
4     True
5    False
6     True
7    False
8     True
dtype: bool
于 2013-10-22T23:15:06.377 回答
0

您真的不想删除重复项 - 您想删除相同的后续行。因为同一买卖对可能在一天中发生多次,不一定连续发生。我会像这样遍历数据框:

for i in df.index:
    if(i-1 in df.index and df['Ask'][i]==df['Ask'][i-1] and df['Bid'][i]==df['Bid'][i]):
        df = df.drop([i])

我相信可以有一个更优雅的解决方案,但这是你会发现有用的一般想法......

于 2013-10-22T23:06:23.883 回答