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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1686閲覧

fillnaでの欠損値の補完

D7U

総合スコア22

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/06/10 14:07

具体的なコードで申し訳ないのですが、
"Sectort Type" = "SH"の"施設内うつ病患者総定数"の値を、
「同セクタータイプの平均値で補完」しようと下記のコードを書きましたが、
欠損値が補完されず、#N/Aのままで残ってしまいます。
この場合適切なコーディングは何でしょうか。

python

1df001[df001["Sector Type"] == "SH"]["施設内患者想定総数"].fillna(df001[df001["Sector Type"] == "SH"]["施設内患者想定総数"].describe()["mean"],inplace=True)

どなたかご教示頂きますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の warning が出ていませんか?

A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

pandas のインデックス操作の結果や関数の返り値は必要に応じて、元のデータフレームを参照する view、またはコピーになります。
今回、df001[df001["Sector Type"] == "SH"] の結果はコピーとなるため、元の Data Frame とは別の Data Frame となります。
そのため、そのコピーに対して、fillna() で値を変更しても元の Data Frame には反映されません。
以下のように fillna() した結果を同じ範囲に代入する形をとってください。

python

1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame({"Col1": ["A", "A", "B", "B"], "Col2": [1, np.nan, 3, 4]}) 5print(df) 6# Col1 Col2 7# 0 A 1.0 8# 1 A NaN 9# 2 B 3.0 10# 3 B 4.0 11 12# 作成されたコピーに対して、fillna() してるので、元の DataFrame である df は変更されない。 13df[df["Col1"] == "A"]["Col2"].fillna(1, inplace=True) 14 15print(df) 16# Col1 Col2 17# 0 A 1.0 18# 1 A NaN 19# 2 B 3.0 20# 3 B 4.0 21# 以下のように代入して置き換えればよい。 22df.loc[df["Col1"] == "A", "Col2"] = df.loc[df["Col1"] == "A", "Col2"].fillna(2) 23print(df) 24# Col1 Col2 25# 0 A 1.0 26# 1 A 2.0 27# 2 B 3.0 28# 3 B 4.0

質問者さんのコードの場合、以下のようになります。

python

1cond = df001["Sector Type"] == "SH", "施設内患者想定総数" # 置換範囲 2mean = df001.loc[cond].mean() 3df001.loc[cond] = df001.loc[cond].fillna(mean)

投稿2019/06/10 17:04

tiitoi

総合スコア21960

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

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

D7U

2019/06/11 04:15

ありがとうございます! そのように因数を持たせることが出来ることを初めて知りました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問