2017-05-18 97 views
0

我有一個熊貓數據框如下:熊貓:刪除行從數據幀匹配條件

ID PROD QTY PRICE FEES 
1  G  2  120 -1.2 
2  B  5  150 -1.5 
3  S  2  80  -2.0 
4  T  5  300 +1.0 
1  G  -2  120 +1.2 
2  B  -5  150 +1.5 

我希望能刪除其中所有滿足以下條件的行:

1)它們具有相同的ID

2)它們具有相等的價格

3)它們具有相反的QTY

4)他們有相反費用

期望的結果如下:

ID PROD QTY PRICE FEES 
3  S  2  80  -2.0 
4  T  5  300 +1.0 

我的第一本能是排序ID &價格數據幀,然後重複數據幀,但是我正在尋找爲更加pythonic更有效的方法。

也許一個解決方案可能需要一個ID &價格的組,然後刪除費用和數量等於零。

謝謝

+0

是否有關於這些重複的任何規則?他們只出現兩次?如果沒有,你是否進行所有配對比較的ID和價格匹配? – ayhan

+0

原則上是的,他們只出現兩次 – Kelaref

回答

1

設置

df=pd.DataFrame({'FEES': {0: -1.2, 1: -1.5, 2: -2.0, 3: 1.0, 4: 1.2, 5: 1.5}, 
'ID': {0: 1, 1: 2, 2: 3, 3: 4, 4: 1, 5: 2}, 
'PRICE': {0: 120, 1: 150, 2: 80, 3: 300, 4: 120, 5: 150}, 
'PROD': {0: 'G', 1: 'B', 2: 'S', 3: 'T', 4: 'G', 5: 'B'}, 
'QTY': {0: 2, 1: 5, 2: 2, 3: 5, 4: -2, 5: -5}}) 

解決方案

#define a list to store duplicates index 
dups=[] 

#apply conditions to locate rows to be removed. 
df.apply(lambda x: dups.extend(df.loc[(df.ID==x.ID)&(df.PRICE==x.PRICE)&(df.QTY+x.QTY==0)&(df.FEES+x.FEES==0)].index.tolist()), axis=1) 

#filter results based on dups ID 
df.loc[~df.index.isin(dups)] 
Out[122]: 
    ID PROD QTY PRICE FEES 
2 3 S 2  80 -2.0 
3 4 T 5 300 1.0 
2

爲了得到第一部分,你可以先刪除基於ID和價格都重複:

df.drop_duplicates(subset = ['ID', 'PRICE'], inplace=True) 

然後要GROUPBY所有的ID,以確定總數量和總費用:

df = df.groupby('ID', as_index=False).sum() 

然後,您可以過濾掉任何與和0

df[df.QTY != 0] 
+0

只是更新了我的問題的清晰度 – Kelaref

+0

您可以將此邏輯應用於您的所有問題。同樣的邏輯。 –