在pandas DataFrame的drop_duplicates方法中考虑重复索引

Rus*_*rdt 6 python duplicates pandas

drop_duplicatesPandas DataFrame 的方法在删除重复行时会考虑所有列(默认)或列子集(可选),并且不能考虑重复索引。

我正在寻找一种干净的单行解决方案,该方案在确定重复行时会考虑索引以及子集或所有列。例如,考虑DataFrame

df = pd.DataFrame(index=['a', 'b', 'b', 'c'], data={'A': [0, 0, 0, 0], 'B': [1, 0, 0, 0]})
   A  B
a  0  1
b  0  0
b  0  0
c  0  0
Run Code Online (Sandbox Code Playgroud)

默认使用的drop_duplicates方法给出

df.drop_duplicates()
   A  B
a  0  1
b  0  0
Run Code Online (Sandbox Code Playgroud)

如果在确定重复行时也考虑了索引,则结果应为

df.drop_duplicates(consider_index=True) # not a supported keyword argument
   A  B
a  0  1
b  0  0
c  0  0
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以提供此功能,这比我目前的方法要好:

df['index'] = df.index
df.drop_duplicates(inplace=True)
del df['index']
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 6

调用reset_indexduplicated,然后为原始索引:

df = df[~df.reset_index().duplicated().values]
print (df)
   A  B
a  0  1
b  0  0
c  0  0
Run Code Online (Sandbox Code Playgroud)


Chr*_*s A 6

尝试这个:

df.reset_index().drop_duplicates().set_index('[name_of_your_index_here]')
Run Code Online (Sandbox Code Playgroud)

[输出]

       A  B
index      
a      0  1
b      0  0
c      0  0
Run Code Online (Sandbox Code Playgroud)

  • 我对上面的答案投了赞成票,因为代码运行得更快 @coldspeed 答案,“每个循环 976 µs ± 5.81 µs(7 次运行的平均值 ± 标准偏差,每次 1000 个循环)” @Chris A 答案,“每个循环 1.41 ms ± 13.1 µs”循环(7次运行的平均值±标准偏差,每次1000次循环)`当然,这忽略了可读性,我认为那里没有明显的赢家。 (2认同)