パンダデータフレームでセルをNaNに設定する方法


97

データフレームの列の不良値をNaNで置き換えたいのですが。

mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)

df[df.y == 'N/A']['y'] = np.nan

ただし、dfのコピーを処理しているため、最後の行は失敗し、警告がスローされます。それで、これを処理する正しい方法は何ですか?ilocまたはixを使用した多くのソリューションを見てきましたが、ここではブール条件を使用する必要があります。

回答:


122

ただ使うreplace

In [106]:
df.replace('N/A',np.NaN)

Out[106]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

あなたがしようとしていることはチェーンインデックスと呼ばれています:http : //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

を使用locして、元のdFで動作することを確認できます。

In [108]:
df.loc[df['y'] == 'N/A','y'] = np.nan
df

Out[108]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

13

を使用replaceすると問題が解決するようですが、代替案を提案したいと思います。列内の数値と一部の文字列値の混合で、文字列がnp.nanに置き換えられず、列全体が適切になる問題。おそらく、元の列はオブジェクト型であると思います

Name: y, dtype: object

本当に必要なのは、数値以外のすべての値をNaNに置き換えて、数値列にすることです(適切な型があり、かなり高速になります)。

したがって、適切な変換コードは

pd.to_numeric(df['y'], errors='coerce')

errors='coerce'数値に解析できない文字列を強制的にNaNにすることを指定します。列タイプは

Name: y, dtype: float64

10

あなたは置換を使うことができます:

df['y'] = df['y'].replace({'N/A': np.nan})

inplaceパラメータにも注意してくださいreplace。次のようなことができます:

df.replace({'N/A': np.nan}, inplace=True)

これにより、コピーを作成せずにdf内のすべてのインスタンスが置き換えられます。

同様に、空の文字列やNone値など、他のタイプの不明な値に遭遇した場合:

df['y'] = df['y'].replace({'': np.nan})

df['y'] = df['y'].replace({None: np.nan})

参照:最新のパンダ-交換


1
df.loc[df.y == 'N/A',['y']] = np.nan

これはあなたの問題を解決します。二重[]を使用して、DataFrameのコピーで作業しています。変更できるようにするには、1回の呼び出しで正確な場所を指定する必要があります。


0

これらのスニペットを試すことができます。

[16]:mydata = {'x':[10、50、18、32、47、20]、 'y':['12'、 '11'、 'N / A'、 '13'、 ' 15 '、' N / A ']}
[17]:df = pd.DataFrame(mydata)

[18]:df.y [df.y == "N / A"] = np.nan

Out [19]:df 
    xy
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN

0

pandas 1.0.0以降、numpyを使用してデータフレームにnull値を作成する必要がなくなりました。代わりに、pandas.NA(pandas._libs.missing.NAType型)を使用するだけでよいので、データフレーム内ではnullとして扱われますが、データフレームコンテキスト外ではnullにはなりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.