在市场数据中删除重复

时间:2013-10-22 22:56:23

标签: python pandas

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

 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

如果出价和询价都与之前的行相同,那么它就会掉线。

有任何明显的方法吗?

2 个答案:

答案 0 :(得分: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

然后我们制作一个系列,只有当其中任何一个为真且一行与下一行不同时才为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

答案 1 :(得分: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])

我确信可以有一个更优雅的解决方案,但这是你可以找到有用的一般想法......