我知道如何删除基于列数据的重复行。我也知道如何删除基于行索引的重复行。我的问题是:有没有一种方法可以删除基于索引和一列的重复行?谢谢!
carvr3hs1#
这可以通过将索引转换为列来完成。下面是一个样本数据集(供参考,我认为有人否决了你的问题,因为它没有包括一个样本数据集):
df=pd.DataFrame({'a':[1,2,2,3,4,4,5], 'b':[2,2,2,3,4,5,5]}, index=[0,1,1,2,3,5,5])
输出:
a b 0 1 2 1 2 2 1 2 2 2 3 3 3 4 4 5 4 5 5 5 5
然后你可以使用下面这行。第一个reset_index()用索引号创建一个新的列。然后你可以根据新的索引列和另一列(在本例中是b)删除重复项。之后,你可以使用set_index('index ')将索引设置为原始索引值:
df.reset_index().drop_duplicates(subset=['index','b']).set_index('index')
a b index 0 1 2 1 2 2 2 3 3 3 4 4 5 4 5
cyej8jka2#
如果你不想像JJ101's answer那样反复重置索引,你可以使用pandas的.duplicated()方法来代替.drop_duplicates()。如果您关心索引和某些列b中的重复项,则可以分别用df.index.duplicated()和df.duplicated(subset="b")标识相应的索引。
.duplicated()
.drop_duplicates()
b
df.index.duplicated()
df.duplicated(subset="b")
clean_df = df[~(df.index.duplicated() & df.duplicated(subset="b"))] print(clean_df)
a b 0 1 2 1 2 2 2 3 3 3 4 4 5 4 5
2条答案
按热度按时间carvr3hs1#
这可以通过将索引转换为列来完成。
下面是一个样本数据集(供参考,我认为有人否决了你的问题,因为它没有包括一个样本数据集):
输出:
然后你可以使用下面这行。第一个reset_index()用索引号创建一个新的列。然后你可以根据新的索引列和另一列(在本例中是b)删除重复项。之后,你可以使用set_index('index ')将索引设置为原始索引值:
输出:
cyej8jka2#
如果你不想像JJ101's answer那样反复重置索引,你可以使用pandas的
.duplicated()
方法来代替.drop_duplicates()
。如果您关心索引和某些列
b
中的重复项,则可以分别用df.index.duplicated()
和df.duplicated(subset="b")
标识相应的索引。输出: