欠測値は一般的であり、人的エラー、機器エラー、別のチームからの処理、または特定の観測のデータの不足が原因で発生します。
このバイトでは、NaNを入力する方法を見ていきます。
DataFrame
、NaNを埋めて処理することを選択した場合。
まず、モックを作成しましょう DataFrame
いくつかのランダムな値が削除されました:
import numpy as np
array = np.random.randn(25, 3)
mask = np.random.choice([1, 0], array.shape, p=[.3, .7]).astype(bool)
array[mask] = np.nan
df = pd.DataFrame(array, columns=['Col1', 'Col2', 'Col3'])
Col1 Col2 Col3
0 -0.671603 -0.792415 0.783922
1 0.207720 NaN 0.996131
2 -0.892115 -1.282333 NaN
3 -0.315598 -2.371529 -1.959646
4 NaN NaN -0.584636
5 0.314736 -0.692732 -0.303951
6 0.355121 NaN NaN
7 NaN -1.900148 1.230828
8 -1.795468 0.490953 NaN
9 -0.678491 -0.087815 NaN
10 0.755714 0.550589 -0.702019
11 0.951908 -0.529933 0.344544
12 NaN 0.075340 -0.187669
13 NaN 0.314342 -0.936066
14 NaN 1.293355 0.098964
たとえば、XNUMX番目の列をプロットしてみましょう。
plt.plot(df['Col3'])
さまざまな手法で埋められた場合–このNaNで埋められたグラフは次のように置き換えることができます。
fillna()–平均、中央値、最頻値
これらの値を新しい列に入力して、入力する列に割り当てるか、を使用してインプレースで割り当てることができます。 inplace
口論。 ここでは、検査を容易にするために、新しい列に入力された値を抽出します。
mean = df['Col3'].fillna(df['Col3'].mean(), inplace=False)
median = df['Col3'].fillna(df['Col3'].median(), inplace=False)
mode = df['Col3'].fillna(df['Col3'].mode(), inplace=False)
列の中央値、平均、最頻値は次のとおりです。 -0.187669
, -0.110873
および 0.000000
これらの値は、各NaNにそれぞれ使用されます。 これは定数値で効果的に満たされ、入力される値は列の全体に依存します。
まず、中央値を入力すると、次のようになります。
平均値の場合:
モード値の場合:
fillna()–定数値
代わりに定数値を入力することもできます。
ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!
constant = df['Col3'].fillna(0, inplace=False
これにより、各NaNの代わりに定数値(0)が設定されます。 0
は中央値と平均に近く、最頻値に等しいため、入力された値は、模擬データセットのその方法によく似ています。
0 0.783922
1 0.996131
2 0.000000
3 -1.959646
4 -0.584636
5 -0.303951
6 0.000000
7 1.230828
8 0.000000
9 0.000000
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
fillna()–順方向および逆方向の塗りつぶし
各行で–次の前または後の行から値を取得して、順方向または逆方向の塗りつぶしを実行できます。
ffill = df['Col3'].fillna(method='ffill')
bfill = df['Col3'].fillna(method='bfill')
フォワードフィルでは、行2が欠落しているため、行1の値がXNUMX番目の値を埋めるために使用されます。 値は前方に伝播します。
0 0.783922
1 0.996131
2 0.996131
3 -1.959646
4 -0.584636
5 -0.303951
6 -0.303951
7 1.230828
8 1.230828
9 1.230828
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
逆充填では、逆のことが起こります。 行2は、行3の値で埋められます。
0 0.783922
1 0.996131
2 -1.959646
3 -1.959646
4 -0.584636
5 -0.303951
6 1.230828
7 1.230828
8 -0.702019
9 -0.702019
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
ただし、複数ある場合 NaN
順番に–これらはうまく機能せず、NaNをさらに下にカスケードして、データを歪め、実際に記録された値を削除する可能性があります。
interpolate()
interpolate()
メソッドは値の補間をSciPyに委任します 値を補間するための一連のメソッド。 それは、以下を含む多種多様な議論を受け入れます。 nearest
, zero
, slinear
, quadratic
, cubic
, spline
, barycentric
, polynomial
, krogh
, piecewise_polynomial
, spline
, pchip
, akima
, cubicspline
, etc.
補間は、以前の方法のように定数または半変数で値を入力するよりもはるかに柔軟で「スマート」です。
補間は、次のような他の方法では不可能な方法でシーケンスを適切に埋めることができます。
s = pd.Series([0, 1, np.nan, np.nan, np.nan, 5])
s.fillna(s.mean()).values
s.fillna(method='ffill').values
s.interpolate().values
デフォルトの補間は線形であり、 1...5
おそらく 1, 2, 3, 4, 5
シーケンスはそれほどフェッチされていません(ただし、保証されていません)。 ここでは、一定の充填と順方向または逆方向の充填の両方が惨めに失敗します。 一般的に言えば、ノイズの多い信号や破損したデータセットでNaNを埋める場合、補間は通常、良い友達になります。
補間のタイプを試してみると、より良い結果が得られる場合があります。
ここにXNUMXつの補間方法があります(splice
および polynomial
が必要です order
口論):
nearest = df['Col3'].interpolate(method='nearest')
polynomial = df['Col3'].interpolate(method='polynomial', order=3)
これらの結果は次のとおりです。
と: