在我正在使用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
答案 0 :(得分:1)
我可以看到您的代码有两个问题:
drop_duplicates()
将考虑所有列,并删除在所有这些行中重复的行。如果您要删除某个列或一组列的重复项,则应使用subset
。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)