112

我有一个像这样的熊猫数据框:

                    a         b
2011-01-01 00:00:00 1.883381  -0.416629
2011-01-01 01:00:00 0.149948  -1.782170
2011-01-01 02:00:00 -0.407604 0.314168
2011-01-01 03:00:00 1.452354  NaN
2011-01-01 04:00:00 -1.224869 -0.947457
2011-01-01 05:00:00 0.498326  0.070416
2011-01-01 06:00:00 0.401665  NaN
2011-01-01 07:00:00 -0.019766 0.533641
2011-01-01 08:00:00 -1.101303 -1.408561
2011-01-01 09:00:00 1.671795  -0.764629

有没有一种有效的方法来查找具有 NaN 的行的“整数”索引?在这种情况下,所需的输出应该是[3, 6].

4

13 回答 13

154

这是一个更简单的解决方案:

inds = pd.isnull(df).any(1).nonzero()[0]

In [9]: df
Out[9]: 
          0         1
0  0.450319  0.062595
1 -0.673058  0.156073
2 -0.871179 -0.118575
3  0.594188       NaN
4 -1.017903 -0.484744
5  0.860375  0.239265
6 -0.640070       NaN
7 -0.535802  1.632932
8  0.876523 -0.153634
9 -0.686914  0.131185

In [10]: pd.isnull(df).any(1).nonzero()[0]
Out[10]: array([3, 6])
于 2012-12-25T18:41:23.723 回答
53

对于数据框df

import numpy as np
index = df['b'].index[df['b'].apply(np.isnan)]

会给你返回MultiIndex你可以用来索引的东西df,例如:

df['a'].ix[index[0]]
>>> 1.452354

对于整数索引:

df_index = df.index.values.tolist()
[df_index.index(i) for i in index]
>>> [3, 6]
于 2012-12-24T03:02:12.320 回答
21

一条线解决方案。但是它仅适用于一列。

df.loc[pandas.isna(df["b"]), :].index
于 2019-01-15T11:23:19.883 回答
12

以防万一,如果您想为所有列找到“nan”的坐标(假设它们都是数字),请执行以下操作:

df = pd.DataFrame([[0,1,3,4,np.nan,2],[3,5,6,np.nan,3,3]])

df
   0  1  2    3    4  5
0  0  1  3  4.0  NaN  2
1  3  5  6  NaN  3.0  3

np.where(np.asanyarray(np.isnan(df)))
(array([0, 1]), array([4, 3]))
于 2017-09-07T14:49:25.130 回答
10

不知道这是否为时已晚,但您可以使用 np.where 来查找非值的索引,如下所示:

indices = list(np.where(df['b'].isna()[0]))
于 2018-09-11T13:07:05.907 回答
5

如果您有日期时间索引并且您希望获得以下值:

df.loc[pd.isnull(df).any(1), :].index.values
于 2019-05-03T21:34:42.710 回答
5

以下是一些方法的测试:

%timeit np.where(np.isnan(df['b']))[0]
%timeit pd.isnull(df['b']).nonzero()[0]
%timeit np.where(df['b'].isna())[0]
%timeit df.loc[pd.isna(df['b']), :].index

以及它们对应的时间:

333 µs ± 9.95 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
280 µs ± 220 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
313 µs ± 128 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
6.84 ms ± 1.59 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

就时间而言,这似乎pd.isnull(df['DRGWeight']).nonzero()[0]赢得了胜利,但前三种方法中的任何一种都具有可比的性能。

于 2019-08-28T18:02:08.573 回答
3

另一个简单的解决方案是list(np.where(df['b'].isnull())[0])

于 2019-12-18T15:03:36.437 回答
1

这是另一个更简单的方法:

df = pd.DataFrame([[0,1,3,4,np.nan,2],[3,5,6,np.nan,3,3]])

inds = np.asarray(df.isnull()).nonzero()

(array([0, 1], dtype=int64), array([4, 3], dtype=int64))
于 2018-05-03T17:14:50.383 回答
1

我正在寻找具有 NaN 值的行的所有索引。
我的工作解决方案:

def get_nan_indexes(data_frame):
    indexes = []
    print(data_frame)
    for column in data_frame:
        index = data_frame[column].index[data_frame[column].apply(np.isnan)]
        if len(index):
            indexes.append(index[0])
    df_index = data_frame.index.values.tolist()
    return [df_index.index(i) for i in set(indexes)]
于 2018-10-04T15:20:54.630 回答
1

这将为您提供每列中 nan 的索引值:

df.loc[pd.isna(df).any(1), :].index
于 2021-06-16T03:12:47.610 回答
0

让数据框命名为df,感兴趣的列(即我们试图在其中查找 null 的列)为'b'。然后以下代码段给出了数据框中所需的 null 索引:

   for i in range(df.shape[0]):
       if df['b'].isnull().iloc[i]:
           print(i)
于 2019-05-20T11:33:45.600 回答
0
    index_nan = []
        for index, bool_v in df["b"].iteritems().isna():
           if bool_v == True:
               index_nan.append(index)
    print(index_nan)
于 2021-12-02T11:27:12.467 回答