用于熊猫数据框时看不到drop_duplicates的影响

时间:2019-12-18 18:39:33

标签: python pandas

在我正在使用Python处理的数据帧上调用pandas.drop_duplicates()之后,我看不到任何变化。

select VendName,  
  1-abs(((cast(sum(UnitsReceived) as decimal(5,0))) - (cast(sum(AsnPsUnits) as decimal(5,0)))) /(cast(sum(AsnPsUnits) as decimal(5,0)))) as ASNpsAcc
from 
(
select ID, UnitsReceived, AsnPsUnits from VenTest2 where ID<20
union
select ID1, UnitsReceived1, AsnPsUnits1 from VenTest1
)a

group by VendName

This is the data I'm working on

3 个答案:

答案 0 :(得分:1)

我可以看到您的代码有两个问题:

  1. 您没有传递子集。默认情况下,在熊猫的documentation中,drop_duplicates()将考虑所有列,并删除在所有这些行中重复的行。如果您要删除某个列或一组列的重复项,则应使用subset
  2. 您应检查参数inplace的效果,因此应检查df = df.drop_duplicates(['col_1','col_2'])

在考虑了这两个项目之后,您应该注意到差异。

这里是一个例子:

import pandas as pd
import numpy as np
df = pd.DataFrame({'col_1':[1,2,3,3,1],'col_2':[1,1,3,3,1],'col_3':['a','b','c','d','a']})
print(df)

   col_1  col_2 col_3
0      1      1     a
1      2      1     b
2      3      3     c
3      3      3     d
4      1      1     a

如果我们使用drop_duplicates()而没有任何子集,则它将删除所有列均重复的行。这是行0和4,因为它们是所有3列的重复项。由于默认值为keep='first',因此您将保留第0行并删除第4行。

如果我们希望使用一个子集,例如drop_duplicates(['col_1','col_2']),那么我们可以期望两组重复的行0和4(因为col_1和col_2的值相同)以及行2和3,因为您是不考虑col_3。与第一种情况类似,您将删除4并保留0,删除第3行并保留2。 这是第一种情况的输出:

df.drop_duplicates(inplace=True)
print(df)
   col_1  col_2 col_3
0      1      1     a
1      2      1     b
2      3      3     c
3      3      3     d

这是第二种情况:

df.drop_duplicates(['col_1','col_2'],inplace=True)
print(df)
   col_1  col_2 col_3
0      1      1     a
1      2      1     b
2      3      3     c

答案 1 :(得分:0)

它将删除完全重复的行。

如果一行中的所有内容都等于列,那么它就不会重复,也不会删除。

答案 2 :(得分:0)

如果没有重复的行,我相信您需要指定列。对于您的用例,是这样的:

df = pd.read_excel('sample_data.xlsx', index_col=0)
col = 'state'
df.drop_duplicates(subset=col)