繁体   English   中英

使用非唯一索引从pandas DataFrame中删除行

[英]Delete rows from pandas DataFrame with non-unique index

我正在寻找一种方法来删除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]]

不过,也许这会好得多吗?

这也不是很优雅,但让我发布它作为替代方案:

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

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

替代解决方案(使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM