簡體   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