scikit-learnでカテゴリカルな欠損値をインプットする
2023-09-27 22:11:01
質問
pandasのデータで、テキスト型のカラムがいくつかあります。これらのテキストカラムと一緒にいくつかのNaN値があります。私がやろうとしていることは、これらのNaNを次の方法でインプットすることです。
sklearn.preprocessing.Imputer
(NaNを最も頻度の高い値で置き換える)ことです。問題は実装にあります。
30カラムのPandasデータフレームdfがあり、そのうち10カラムはカテゴリカルな性質を持っているとします。
一度実行すると
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)
imp.fit(df)
Pythonは
error: 'could not convert string to float: 'run1''
ここで、'run1'はカテゴリデータを持つ最初の列からの通常の(欠損のない)値です。
どのようなヘルプも非常に歓迎されます。
どのように解決するのですか?
数値列には平均値を、非数値列には最頻値を使うには、次のようにすればよいでしょう。さらに、整数と浮動小数点数を区別することもできます。整数の列には代わりに中央値を使うのが理にかなっているかもしれませんね。
import pandas as pd
import numpy as np
from sklearn.base import TransformerMixin
class DataFrameImputer(TransformerMixin):
def __init__(self):
"""Impute missing values.
Columns of dtype object are imputed with the most frequent value
in column.
Columns of other types are imputed with mean of column.
"""
def fit(self, X, y=None):
self.fill = pd.Series([X[c].value_counts().index[0]
if X[c].dtype == np.dtype('O') else X[c].mean() for c in X],
index=X.columns)
return self
def transform(self, X, y=None):
return X.fillna(self.fill)
data = [
['a', 1, 2],
['b', 1, 1],
['b', 2, 2],
[np.nan, np.nan, np.nan]
]
X = pd.DataFrame(data)
xt = DataFrameImputer().fit_transform(X)
print('before...')
print(X)
print('after...')
print(xt)
というように印刷します。
before...
0 1 2
0 a 1 2
1 b 1 1
2 b 2 2
3 NaN NaN NaN
after...
0 1 2
0 a 1.000000 2.000000
1 b 1.000000 1.000000
2 b 2.000000 2.000000
3 b 1.333333 1.666667
関連
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] 環境変数の値にアクセスする方法
-
[解決済み】NumPyかPandasか。NaNを持ちながら配列の型を整数に保つ
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複