【问题标题】:Python pandas issues with .drop and a non-unique index.drop 和非唯一索引的 Python pandas 问题
【发布时间】:2019-03-11 22:54:00
【问题描述】:

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

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

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

df = df[df.column2 != myvalue]

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

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

【问题讨论】:

  • 如果您可以提供示例数据框并提供预期的输出,我们可以为您提供更好的帮助。
  • df = df[df.column2 == myvalue]。不要在这里使用索引;索引是重复的,因此与删除条件没有直接关系。
  • @ALollz:我想使用 drop 的原因是这些 DataFrame 是对象的属性。我当然可以这样做,然后使用 setattr()。我不确定这是否比按照 ecortazar 在他的回答中建议的那样重新启动索引并使用就地下降更可取。
  • @Trademark 在这种情况下,您可能应该重置索引。如果你不确定它为什么被复制,那么很可能它实际上并不是你关心的东西,所以给它一个新的。如果我不得不猜测,它会作为 appendconcat 的结果而重复,如果是这种情况,您可以通过将 ignore_index=True 作为参数添加到这些方法来在代码中进一步修复它。
  • @ALollz:你的猜测可能是对的,我确实连接了几个 csv 文件来创建 DataFrame(另一方面,我也使用其他没有这个问题的 DataFrames 来做)。非常感谢!

标签: python pandas dataframe


【解决方案1】:

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

df = df.reset_index()

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

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

df.index.has_duplicates

【讨论】:

  • 太好了,这似乎已经解决了!我仍然不确定当 DataFrame 中没有重复行时如何获得非唯一索引。你能给我解释一下吗?
  • 重复行和重复索引是不同的东西。你应该确保测试正确的东西。我已经编辑了我的回复。
  • 那你怎么能得到重复的索引呢?我知道如果没有看到数据可能很难回答,但我只从 csv 文件中加载它,通过删除几列和重复行来清理 DataFrame,然后我添加另一列,其值基于其他两列的值.在这个过程中,我在哪里可以获得非唯一索引?抱歉,如果这对于有意义的答案来说太模糊了。编辑:Alollz 在评论中建议,当我在加载过程中连接 csv 文件时可能会发生这种情况。
  • 从 CSV(或之后)读取时,您是否将特定列设置为索引?如果是这样,则该列在成为索引之前可能具有重复项。编辑:如果您要连接多个 df,您可能需要在连接中添加 ignore_index=True,以便在连接时重置索引
  • 我对此有点奇怪。我需要将 4 列放入日期时间。 1列(系列)工作得很好。其他 3 个给我 InvalidIndexError: Reindexing only valid with unique value Index objects。当我尝试上述方法检查索引重复时,它显示为 false,因为没有。如果我重置索引,我仍然会得到同样的错误。这是我第一次看到这样的东西。
猜你喜欢
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
相关资源
最近更新 更多