考虑 pandas DataFrame 的 drop_duplicates 方法中的重复索引问题。

8

Pandas DataFrame的drop_duplicates方法会考虑所有列(默认)或者一部分列(可选),以删除重复的行,但不考虑重复的索引。

我正在寻找一个干净的一行解决方案,它可以考虑索引和一部分或全部的列,以确定重复的行。例如,考虑以下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

默认情况下使用drop_duplicates方法会给出

df.drop_duplicates()
   A  B
a  0  1
b  0  0

如果在确定重复行时也考虑索引,则结果应为:
df.drop_duplicates(consider_index=True) # not a supported keyword argument
   A  B
a  0  1
b  0  0
c  0  0

有没有一种比我现在的方法更好的方式来实现这个功能:
df['index'] = df.index
df.drop_duplicates(inplace=True)
del df['index']
2个回答

10

调用 reset_indexduplicated,然后对原始数据进行索引:

df = df[~df.reset_index().duplicated().values]
print (df)
   A  B
a  0  1
b  0  0
c  0  0

6

试试这个:

df.reset_index().drop_duplicates().set_index('[name_of_your_index_here]')

[输出]

       A  B
index      
a      0  1
b      0  0
c      0  0

2
我点赞了上面的回答,因为代码运行更快。 @coldspeed的答案是 976 µs ± 5.81 µs 每次循环 (7次运行的平均值±标准差,每次1000次循环) @Chris A的答案是 1.41 ms ± 13.1 µs 每次循环 (7次运行的平均值±标准差,每次1000次循环) 当然,这忽略了可读性,我认为在这方面没有明显的优胜者。 - Russell Burdt
你回答中还有一个微妙之处,它假设DataFrame的索引名称为“index”。任何其他名称都会引发KeyError。 - Russell Burdt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接