web-dev-qa-db-ja.com

特定の値(セル内)がixまたはilocを使用して動作しないpandas DataFrameのNaNであるかどうかを確認する

次のpandasDataFrameがあるとします。

import pandas as pd
df = pd.DataFrame({"A":[1,pd.np.nan,2], "B":[5,6,0]})

次のようになります:

>>> df
     A  B
0  1.0  5
1  NaN  6
2  2.0  0

最初のオプション

特定の値がNaNかどうかを確認する1つの方法を知っています。これは次のとおりです。

>>> df.isnull().ix[1,0]
True

2番目のオプション(機能していません)

ixを使用する以下のオプションも同様に機能すると考えましたが、そうではありません。

>>> df.ix[1,0]==pd.np.nan
False

私もilocを試して同じ結果を得ました:

>>> df.iloc[1,0]==pd.np.nan
False

ただし、ixまたはilocを使用してこれらの値を確認すると、次のようになります。

>>> df.ix[1,0]
nan
>>> df.iloc[1,0]
nan

したがって、2番目のオプションが機能しない理由NaNまたはixを使用してiloc値をチェックすることは可能ですか?

16
Cedric Zoppolo

これを試して:

In [107]: pd.isnull(df.iloc[1,0])
Out[107]: True

UPDATE:新しいPandasバージョンでは pd.isna() を使用します。

In [7]: pd.isna(df.iloc[1,0])
Out[7]: True
33
MaxU

pd.isna(cell_value)を使用して、特定のセル値がnanであるかどうかを確認できます。または、pd.notna(cell_value)を使用して反対を確認します。

パンダのソースコードから:

def isna(obj):
    """
    Detect missing values for an array-like object.

    This function takes a scalar or array-like object and indicates
    whether values are missing (``NaN`` in numeric arrays, ``None`` or ``NaN``
    in object arrays, ``NaT`` in datetimelike).

    Parameters
    ----------
    obj : scalar or array-like
        Object to check for null or missing values.

    Returns
    -------
    bool or array-like of bool
        For scalar input, returns a scalar boolean.
        For array input, returns an array of boolean indicating whether each
        corresponding element is missing.

    See Also
    --------
    notna : Boolean inverse of pandas.isna.
    Series.isna : Detect missing values in a Series.
    DataFrame.isna : Detect missing values in a DataFrame.
    Index.isna : Detect missing values in an Index.

    Examples
    --------
    Scalar arguments (including strings) result in a scalar boolean.

    >>> pd.isna('dog')
    False

    >>> pd.isna(np.nan)
    True

上記の答えは素晴らしいです。理解を深めるための例も同じです。

>>> import pandas as pd
>>>
>>> import numpy as np
>>>
>>> pd.Series([np.nan, 34, 56])
0     NaN
1    34.0
2    56.0
dtype: float64
>>>
>>> s = pd.Series([np.nan, 34, 56])
>>> pd.isnull(s[0])
True
>>>

私も数回試しましたが、次の試行はうまくいきませんでした。 @MaxUに感謝します。

>>> s[0]
nan
>>>
>>> s[0] == np.nan
False
>>>
>>> s[0] is np.nan
False
>>>
>>> s[0] == 'nan'
False
>>>
>>> s[0] == pd.np.nan
False
>>>
1
hygull