因此,我们假设我们正在查看市场数据更新。
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
如果出价和询价都与之前的行相同,那么它就会掉线。
有任何明显的方法吗?
答案 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])
我确信可以有一个更优雅的解决方案,但这是你可以找到有用的一般想法......