【问题标题】:Removing rows with NaN in MultiIndex with duplicates在 MultiIndex 中删除带有 NaN 的行并带有重复项
【发布时间】:2018-02-20 03:59:05
【问题描述】:

更新了一个重现我的确切问题的 DataFrame

我有一个问题,即出现在我的索引中的NaN 会导致非唯一行(因为NaN !== NaN)。我需要删除索引中出现NaN 的所有行。我之前的问题有一个带有单个 NaN 行的示例 DataFrame,但是原始解决方案没有解决我的问题,因为它不符合这个宣传不佳的要求:

(请注意,在实际数据中,我有数千个这样的行,包括自 NaN !== NaN 以来的重复行,因此这在索引上是允许的)

(来自我的原始帖子)

问题

>>>import pandas as pd
>>>import numpy as np
>>> df = pd.DataFrame([[1,1,"a"],[1,2,"b"],[1,3,"c"],[1,np.nan,"x"],[1,np.nan,"x"],[1,np.nan,"x"],[2,1,"d"],[2,2,"e"],[np.nan,1,"x"],[np.nan,2,"x"],[np.nan,1,"x"]], columns=["a","b","c"])
>>>df
         c
a   b
1.0 1.0  a
    2.0  b
    3.0  c
    NaN  x
    NaN  x
    NaN  x
2.0 1.0  d
    2.0  e
NaN 1.0  x
    2.0  x
    1.0  x

注意重复的行:(1.0, NaN)(NaN, 1.0)

失败的解决方案:

我尝试了一些简单的方法,例如:

>>>df = df[pandas.notnull(df.index)]

但这失败了,因为 notnull 没有为 MultiIndex 实现。

也是建议的早期答案之一:

>>>df = df.reindex(df.index.dropna())

但是这失败并出现错误:

Exception: cannot handle a non-unique multi-index!

期望的输出:

>>>df
         c
a   b
1.0 1.0  a
    2.0  b
    3.0  c
2.0 1.0  d
    2.0  e

(所有NaN 索引行都被删除,消除所有非唯一行)

【问题讨论】:

    标签: python pandas dataframe nan multi-index


    【解决方案1】:

    选项 1
    reset_indexdropnaset_index .

    c = df.index.names
    df = df.reset_index().dropna().set_index(c)
    df
    
             c
    a   b     
    1.0 1.0  a
        2.0  b
        3.0  c
    2.0 1.0  d
        2.0  e
        2.0  x
        1.0  x
    

    如果您的 MultiIndex 是唯一的,您可以使用...
    选项 2
    df.index.dropnadf.reindex

    df = df.reindex(df.index.dropna())
    

    【讨论】:

    • 这给了我错误:cannot handle a non-unique multi-index!。不过,我想删除这些行的全部原因是它正在创建非唯一的多索引(NaN !== NaN)。我将使用重现我的问题的 DataFrame 更新问题。
    • @stevendesu 另一种方法(不是重新索引)适用于您的新输出。
    • @COLDSPEED 可以确认,尝试了其他选项,它有效:) 谢谢
    • 如果您想保留 NaN 值记录(与 NaN 仅在初始多索引中相反),请不要忘记通过调用 .dropna(subset=['<level_with_nan>']) 指定要过滤掉 NaN 的位置.
    猜你喜欢
    • 2010-09-14
    • 2016-06-01
    • 2021-12-14
    • 2013-11-25
    • 2015-10-20
    • 1970-01-01
    • 2017-09-28
    • 2017-07-04
    • 2021-09-08
    相关资源
    最近更新 更多