【问题标题】:Delete rows from pandas DataFrame with non-unique index从具有非唯一索引的 pandas DataFrame 中删除行
【发布时间】:2016-06-30 06:42:20
【问题描述】:

当索引保证唯一时,我正在寻找一种方法来删除 pandas DataFrame 中的行。

所以,我想从我的 DataFrame df 中删除项目 0 和 4。这将是您用来执行此操作的典型代码:

df.drop([0, 4].index)

如果每个索引都是唯一的,这很好用。但是,如果项目 0、1 和 2 都具有相同的索引,则此代码会删除项目 0、1、2 和 4,而不仅仅是 0 和 4。

我的 DataFrame 设置这种方式是有充分理由的,所以我不想重构我的数据,它看起来大致如下:

        age
site             
mc03    0.39
mc03    0.348
mc03    0.348
mc03    0.42
mc04    0.78

我试过了:

del df.iloc[0]

但这失败了:

AttributeError: __delitem__

对于如何完成这项任务还有其他建议吗?

更新:

我找到了两种方法,但都不是特别优雅。

to_drop = [0, 4]
df = df.iloc[sorted(set(range(len(df))) - set(to_drop))]
# or:
df = df.iloc[[i for i in range(len(df)) if i not in to_drop]]

也许这和它会得到的一样好?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这也不是很优雅,但让我把它贴出来:

    df = df.reset_index().drop([0, 4]).set_index("site")
    

    它暂时将索引更改为常规索引,删除行并重新设置原始索引。这个想法来自this answer

    【讨论】:

      【解决方案2】:

      替代解决方案(使用 numpy):

      In [252]: mask = np.ones(len(df)).astype(bool)
      
      In [253]: mask[[0,4]] = False
      
      In [254]: mask
      Out[254]: array([False,  True,  True,  True, False], dtype=bool)
      
      In [255]: df[mask]
      Out[255]:
              age
      mc03  0.348
      mc03  0.348
      mc03  0.420
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-06
        • 1970-01-01
        • 2017-03-25
        • 2012-10-13
        相关资源
        最近更新 更多