2017-05-18 27 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

您可以将此逻辑应用于您的所有问题。同样的逻辑。 –