English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Pandasのデータ欠損の操作例
現実世界では、データの欠損は常に問題です。機械学習やデータマイニングなどの分野では、欠損値がデータの品質を低下させるため、モデルの予測精度に深刻な問題が発生します。これらの分野では、欠損値の処理はモデルをより正確かつ効果的であるための主要な焦点です
オンライン調査の製品を考えてみましょう。多くの場合、人々は関連するすべての情報を共有しません。ほとんどの人は、その製品を使用している期間を共有しません;ほとんどの人は、その製品を使用している期間や経験を共有しませんが、連絡情報を共有します。したがって、データは常にある方法でまたは別の方法で一部が失われることがあります。これはリアルタイムの状況で非常に一般的です
今、Pandasを使用して欠損値をどのように処理するかを見てみましょう(例えばNAまたはNaN)
# pandasライブラリのインポート import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', ''h'',columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) print(df)
以下は実行結果です:
one two three a -0.576991 -0.741695 0.553172 b NaN NaN NaN NaN c 0.744328 -1.735166 1.749580 NaN を '0' に置き換えました: one two three a -0.576991 -0.741695 0.553172 b 0.000000 0.000000 0.000000 c 0.744328 -1.735166 1.749580
リインデックスの使用で欠損値を持つDataFrameを作成します。出力では、NaNは数値でないことを示します
データの欠損値を検出するのがより簡単(および異なるデータ型の配列)にするために、PandasはISNULL()およびNOTNULL()機能を提供しており、これらはシーケンスやデータフレームのオブジェクトのメソッドでもあります-
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', ''h'',columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) print(df['one'].isnull())
以下は実行結果です:
False True False True False False True False Name: one, dtype: bool
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', ''h'',columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) print(df['one'].notnull())
以下は実行結果です:
True False True False True True g False h True Name: one, dtype: bool
データの集計時、NAはゼロとして扱われます データがすべて不適切であれば、結果も不適切です
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', ''h'',columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) print(df['one'].sum())
以下は実行結果です:
2.02357685917
import pandas as pd import numpy as np df = pd.DataFrame(index=[0,1,2,3,4,5 print(df['one'].sum()
以下は実行結果です:
nan
Pandasは、NA値を非空データで「充填」するためのさまざまな方法を提供しています。fillna関数は以下の方法でNA値を充填できます。
以下のプログラムは「NaN」を「0」に置き換える方法を示します。
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one', ,'two', 'three']) df = df.reindex(['a', 'b', 'c']) print(df) print("NaN を '0' に置き換えました:") print(df.fillna(0))
以下は実行結果です:
one two three a -0.576991 -0.741695 0.553172 b NaN NaN NaN NaN c 0.744328 -1.735166 1.749580 NaN を '0' に置き換えました: one two three a -0.576991 -0.741695 0.553172 b 0.000000 0.000000 0.000000 c 0.744328 -1.735166 1.749580
ここでは、ゼロ値を充填します;逆に、他のどんな値でも充填できます。
「リインデックス」の章で議論された充填概念を使用して、欠損値を充填します。
方法 | 操作 |
pad/fill | 前方充填< |
bfill/backfill | 後方充填 |
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', ''h'',columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) print(df.fillna(method='pad'))
以下は実行結果です:
one two three a 0.077988 0.476149 0.965836 b 0.077988 0.476149 0.965836 c -0.390208 -0.551605 -2.301950 d -0.390208 -0.551605 -2.301950 e -2.000303 -0.788201 1.510072 f -0.930230 -0.670473 1.146615 g -0.930230 -0.670473 1.146615 h 0.085100 0.532791 0.887415
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', ''h'',columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) print(df.fillna(method='backfill'))
以下は実行結果です:
one two three a 0.077988 0.476149 0.965836 b -0.390208 -0.551605 -2.301950 c -0.390208 -0.551605 -2.301950 d -2.000303 -0.788201 1.510072 e -2.000303 -0.788201 1.510072 f -0.930230 -0.670473 1.146615 g 0.085100 0.532791 0.887415 h 0.085100 0.532791 0.887415
もし失われた値のみを除外したい場合は、dropna関数とaxis引数を一緒に使用します。デフォルトでは、axis = 0、つまり行に沿って、これは一行のどの値もNAである場合、その行全体が除外されることを意味します。
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', ''h'',columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) print(df.dropna())
以下は実行結果です:
one two three a 0.077988 0.476149 0.965836 c -0.390208 -0.551605 -2.301950 e -2.000303 -0.788201 1.510072 f -0.930230 -0.670473 1.146615 h 0.085100 0.532791 0.887415
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', ''h'',columns=['one', 'two', 'three']) df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) print(df.dropna(axis=1))
以下は実行結果です:
空のDataFrame Columns: [ ] Index: [a, b, c, d, e, f, g, h]
多くの場合、特定の値を使用して一般的な値を置き換える必要があります。replaceメソッドを適用することで実現できます。
スカラ値を使用してNAを置き換えるのはfillna()関数の同等の動作です。
import pandas as pd import numpy as np df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]}) print(df.replace({1000:10,2000:60}))
以下は実行結果です:
one two 0 10 10 1 20 0 2 30 30 3 40 40 4 50 50 5 60 60
import pandas as pd import numpy as np df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]}) print(df.replace({1000:10,2000:60)
以下は実行結果です:
one two 0 10 10 1 20 0 2 30 30 3 40 40 4 50 50 5 60 60