2013-10-22 100 views
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 

因此,這將是下降的行如果同時買入和賣出是與之前的行相同。

任何明顯的方法來做到這一點?

+1

修復了您的輸出,它假定標記是一個編號列表,將標記更改爲代碼將保留您想要的顯示 – EdChum

回答

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 
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]) 

我敢肯定,可以有一個更優雅的解決方案這一點,但是這是你能找到有用的總體思路...