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

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

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

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

Pythonista

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

受付中

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

T_Y
T_Y

総合スコア23

Google Colaboratory

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

Pythonista

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

1回答

0グッド

0クリップ

158閲覧

投稿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')

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

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/11/26 00:06依頼された後にこの質問は修正されています

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

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さん、欠損値処理もできました。どうもありがとうございました。

回答1

1

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

総合スコア23

melian👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google Colaboratory

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

Pythonista

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