質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Q&A

1回答

501閲覧

欠損値に平均値を代入する

T_Y

総合スコア27

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

0グッド

0クリップ

投稿2022/11/25 13:54

編集2022/11/28 09:45

実現したいこと

'horsepower'は馬力のデータが入っている変数なのですが、df_train.info()を実行すると、object型ということでした。元データを見てみると、?というデータが9件入っていました。

?を欠損値(NaN)に変えて、欠損値に平均値を代入したいと考えています。

私がやったこと

1. ?を欠損値に置き換える

python

1df_train['horsepower'].isnull().sum()

で欠損値の件数を調べたら0件でした。

いずれにしても?は邪魔なので、NaNにするために

python

1df_train['horsepower'] = df_train['horsepower'].replace('?', np.nan)

を実行して?をNaNに変換することができました。

python

1df_train.isnull().sum()

を実行して得られた件数は?の件数と同じく9件でした。

2. 欠損値に平均値を代入する

以前学習したpythonの教材で、欠損値(NaN)を平均値に置き換えるために下のコードを見つけました。

python

1sample_data_frame.fillna(sample_data_frame.mean())

sample_data_frameをこの分析で使用しているファイル名df_trainに変えて、次の実行しました。

python

1df_train['horsepower'] = df_train['horsepower'].fillna(df_train['horsepower'].mean())

を実行したところ

TypeError: can only concatenate str (not "int") to str

というエラー出てしまいました。str数値データのなかにNaNが混ざっているデータ構成は教材でも見かけるのにエラーになってしまいます。

dtypesで'horsepower'を調べたら、

dtype('O')

という結果が返ってきました。

どこを誤っているのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/11/25 14:25

前回の質問の続きだとすれば、df_train['horsepower'] は str 型なのではないでしょうか。
T_Y

2022/11/28 09:48

melianさん、コメントありがとうございます。str型ではないようです。欠損値に置き換え後にdtypesで調べたら、dtype('O')が返ってきました。
melian

2022/11/28 09:58

dtype('O') ということは Python Object という事ですので、str 型の可能性もあり得ます。
T_Y

2022/11/28 13:30

melianさん、コメントありがとうございます。元データを見る限り,?のデータ以外は数値なのです。原因を究明したいのですが、そういう時は?を99999のようなあり得ない数字にして、平均値を当てはめるというようなやりかたを皆さんしているのでしょうか。
melian

2022/11/28 13:37

その様な場合、私は pd.to_numeric() を使っています。 df_train['horsepower'] = pd.to_numeric(df_train['horsepower'], errors='coerce') これで数字(文字列)を数値(int や float)に変換します。
T_Y

2022/11/28 14:03

melianさん、コメントありがとうございます。 float64になりました。
T_Y

2022/11/29 12:13

melianさん、欠損値処理もできました。どうもありがとうございました。
guest

回答1

0

melianさんのお陰で欠損値処理できました。

過程を記録します。

  • 馬力を表す変数'horsepower'の中に?が9件混ざっていました。その他は数字です。
  • この時の'horsepower'の型はObjectです。
  • Object型を数値データにするために、次のコードを実行しました。

python

1df_train['horsepower'] = pd.to_numeric(df_train['horsepower'], errors='coerce')
  • ?を欠損値にするために次のコードを実行しました。

python

1df_train['horsepower'] = df_train['horsepower'].replace('?', np.nan)
  • 欠損値に平均値を代入するために、次のコードを実行しました。

python

1df_train['horsepower'].fillna(df_train['horsepower'].mean())

python

1df_train['horsepower'].describe()

で確認したら、件数が491件でした。欠損値処理ができたと思ったのですが、欠損値のままでした・・・。

投稿2022/11/29 12:20

編集2022/11/29 13:30
T_Y

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問