我有一个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)他们有相同的身份
2)他们的价格相同
3)他们有相反的数量
4)他们有相反的费用
所需的结果如下:
ID PROD QTY PRICE FEES
3 S 2 80 -2.0
4 T 5 300 +1.0
我的第一直觉是通过ID& amp;来对数据帧进行排序。价格,然后迭代数据帧,但我正在寻找更加pythonic更有效的方法。
也许解决方案可能需要ID&价格,然后删除费用和数量等于零的地方。
谢谢
答案 0 :(得分:3)
要获得第一部分,您可以先根据ID和价格删除所有重复项:
df.drop_duplicates(subset = ['ID', 'PRICE'], inplace=True)
然后,您希望将所有ID分组以识别总数量和总费用:
df = df.groupby('ID', as_index=False).sum()
然后你可以用sum 0
过滤掉任何东西df[df.QTY != 0]
答案 1 :(得分: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