English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Pandas データの欠損

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()機能を提供しており、これらはシーケンスやデータフレームのオブジェクトのメソッドでもあります-

インスタンス 1

 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

インスタンス 2

 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はゼロとして扱われます データがすべて不適切であれば、結果も不適切です

インスタンス 1

 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

インスタンス 2

 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を置き換える

以下のプログラムは「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

ここでは、ゼロ値を充填します;逆に、他のどんな値でも充填できます。

前方および後方充填NA

「リインデックス」の章で議論された充填概念を使用して、欠損値を充填します。

方法操作
pad/fill前方充填<
bfill/backfill後方充填

インスタンス 1

 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

インスタンス 2

 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である場合、その行全体が除外されることを意味します。

インスタンス 1

 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

インスタンス 2

 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()関数の同等の動作です。

インスタンス 1

 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

インスタンス 2

 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