【发布时间】:2019-03-11 22:54:00
【问题描述】:
我有一个 pandas DataFrame,比如df,我正在尝试通过索引删除某些行。具体来说:
myindex = df[df.column2 != myvalue].index
df.drop(myindex, inplace = True)
这对于大多数 DataFrame 来说似乎工作得很好,但奇怪的事情似乎发生在一个 DataFrame 上,我得到一个非唯一索引 myindex(我不太清楚为什么,因为 DataFrame 没有重复的行)。更准确地说,删除的值比索引中的值多得多(在极端情况下,我实际上删除了所有行,即使有几百行 column2 有 myvalue)。仅提取唯一值(myindex.unique() 并使用唯一索引删除行也无济于事。同时,
df = df[df.column2 != myvalue]
按我的意愿工作。我宁愿使用 inplace drop 但是更重要的是我想了解为什么结果与直接分配和使用索引的 drop 方法不同。
很遗憾,我无法提供数据,因为这些数据无法发布,而且我不确定到底出了什么问题,我也无法模拟它们。但是,我怀疑这可能与 myindex 不唯一有关(这也让我感到困惑,因为 df 中没有重复的行,但很可能是我误解了索引的创建方式)。
【问题讨论】:
-
如果您可以提供示例数据框并提供预期的输出,我们可以为您提供更好的帮助。
-
做
df = df[df.column2 == myvalue]。不要在这里使用索引;索引是重复的,因此与删除条件没有直接关系。 -
@ALollz:我想使用 drop 的原因是这些 DataFrame 是对象的属性。我当然可以这样做,然后使用 setattr()。我不确定这是否比按照 ecortazar 在他的回答中建议的那样重新启动索引并使用就地下降更可取。
-
@Trademark 在这种情况下,您可能应该重置索引。如果你不确定它为什么被复制,那么很可能它实际上并不是你关心的东西,所以给它一个新的。如果我不得不猜测,它会作为
append或concat的结果而重复,如果是这种情况,您可以通过将ignore_index=True作为参数添加到这些方法来在代码中进一步修复它。 -
@ALollz:你的猜测可能是对的,我确实连接了几个 csv 文件来创建 DataFrame(另一方面,我也使用其他没有这个问题的 DataFrames 来做)。非常感谢!