繁体   English   中英

熊猫:从DataFrame匹配条件中删除行

[英]Pandas: Delete Rows From DataFrame Matching Conditions

我有一个Pandas DataFrame,如下所示:

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)他们有相反的数量

4)他们有相反的费用

所需的结果如下:

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

我的第一个直觉是按ID和价格对数据框进行排序,然后对数据框进行迭代,但是我正在寻找一种更pythonic更有效的方法。

也许解决方案可能需要按ID和价格分组,然后删除手续费和数量等于零的地方。

谢谢

要获得第一部分,您可以首先根据ID和Price删除所有重复项:

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

然后,您想对所有ID进行分组以标识总数量和总费用:

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

然后,您可以过滤出总和为0的任何内容

df[df.QTY != 0]

设定

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM