首页 > 解决方案 > .drop 和非唯一索引的 Python pandas 问题

问题描述

我有一个 pandas DataFrame,比如说df,我正在尝试通过索引删除某些行。具体来说:

myindex = df[df.column2 != myvalue].index
df.drop(myindex, inplace = True)

这对于大多数 DataFrame 来说似乎工作得很好,但是奇怪的事情似乎发生在一个 DataFrame 上,我得到一个非唯一索引myindex(我不太清楚为什么,因为 DataFrame 没有重复的行)。更准确地说,删除的值比索引中的值多得多(在极端情况下,我实际上删除了所有行,即使有几百行column2has myvalue)。仅提取唯一值(myindex.unique()并使用唯一索引删除行也无济于事。同时,

df = df[df.column2 != myvalue]

就像我想要的那样工作。我宁愿使用 inplace drop 但是更重要的是我想了解为什么结果与直接分配和使用索引的 drop 方法不同。

不幸的是,我无法提供数据,因为这些数据无法发布,而且由于我不确定到底出了什么问题,我也无法模拟它们。但是,我怀疑它可能与myindex非唯一性有关(这也让我感到困惑,因为其中没有重复的行,df但很可能是我误解了索引的创建方式)。

标签: pythonpandasdataframe

解决方案


如果您的索引中有重复的值,那么在执行 reset_index 之前可能会有所帮助。这会将您当前的索引设置为一列,并添加一个新的顺序索引(具有唯一值)。

df = df.reset_index()

两种方法不同的原因是,在一种情况下,您传递了一系列布尔值,这些布尔值表示要保留的行和要删除的行(索引值在这里不相关)。在 drop 的情况下,您传递的是索引值列表(映射到多个位置)。

最后,要检查你的索引是否有重复,你不应该检查重复的行。只需这样做:

df.index.has_duplicates

推荐阅读