在具有重复项的 MultiIndex 中删除具有 NaN 的行
Removing rows with NaN in MultiIndex with duplicates
更新了一个重现我确切问题的 DataFrame
我有一个问题,我的索引中出现 NaN
导致非唯一行(自 NaN !== NaN
以来)。我需要删除索引中出现 NaN
的所有行。我之前的问题有一个带有单个 NaN
行的示例 DataFrame,但是原始解决方案没有解决我的问题,因为它不符合这个宣传不佳的要求:
(Note that in the actual data I have thousands of such rows, including duplicate rows since NaN !== NaN
so this is permissible on an index)
(来自我原来的post)
问题
>>>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
索引行,消除任何非唯一行)
选项 1
reset_index
, dropna
, set_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.dropna
和 df.reindex
df = df.reindex(df.index.dropna())
更新了一个重现我确切问题的 DataFrame
我有一个问题,我的索引中出现 NaN
导致非唯一行(自 NaN !== NaN
以来)。我需要删除索引中出现 NaN
的所有行。我之前的问题有一个带有单个 NaN
行的示例 DataFrame,但是原始解决方案没有解决我的问题,因为它不符合这个宣传不佳的要求:
(Note that in the actual data I have thousands of such rows, including duplicate rows since
NaN !== NaN
so this is permissible on an index)
(来自我原来的post)
问题
>>>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
索引行,消除任何非唯一行)
选项 1
reset_index
, dropna
, set_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.dropna
和 df.reindex
df = df.reindex(df.index.dropna())