选择pandas DataFrame中的NaN索引

17 投票
1 回答
30045 浏览
提问于 2025-04-18 18:46

我有一个数据表 df,里面有以下内容:

In [10]: df.index.unique()
Out[10]: array([u'DC', nan, u'BS', u'AB', u'OA'], dtype=object)

我可以很简单地选择像 df.ix["DC"]、df.ix["BS"] 这样的行。但是我在选择 nan 这个索引时遇到了问题。

df.ix[nan], df.ix["nan"], df.ix[np.nan] all won't work.

我该怎么选择索引为 nan 的行呢?

1 个回答

19

一种方法是使用 df.index.isnull() 来找出 NaN(缺失值)的位置:

In [218]: df = pd.DataFrame({'Date': [0, 1, 2, 0, 1, 2], 'Name': ['A', 'B', 'C', 'A', 'B', 'C'], 'val': [0, 1, 2, 3, 4, 5]}, index=['DC', np.nan, 'BS', 'AB', 'OA', np.nan]); df
Out[218]: 
     Date Name  val
DC      0    A    0
NaN     1    B    1
BS      2    C    2
AB      0    A    3
OA      1    B    4
NaN     2    C    5

In [219]: df.index.isnull()
Out[219]: array([False,  True, False, False, False,  True], dtype=bool)

然后你可以用 df.loc 来选择这些行:

In [220]: df.loc[df.index.isnull()]
Out[220]: 
     Date Name  val
NaN     1    B    1
NaN     2    C    5

注意:我最开始的回答是用 pd.isnull(df.index),而不是 Zero 的建议,也就是 df.index.isnull()。其实用 df.index.isnull() 更好,因为对于一些不能包含 NaN 的索引类型,比如 Int64IndexRangeIndexisnull 方法会 立即返回一个全是 False 的数组,而不是逐个检查索引里的每个项目是否是 NaN。

撰写回答