我正在寻找一种方法来删除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]]
虽然这可能会得到它的好处吗?
答案 0 :(得分:3)
这也不是很优雅,但让我发布它作为另一种选择:
df = df.reset_index().drop([0, 4]).set_index("site")
它会暂时将索引更改为常规索引,删除行并重新设置原始索引。这个想法来自this answer。
答案 1 :(得分:1)
替代解决方案(使用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