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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

Q&A

解決済

1回答

1298閲覧

データフレームから条件に合うデータを抽出する

yakinikuteishok

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

0グッド

0クリップ

投稿2020/08/28 12:53

前提・実現したいこと

データフレームの各列毎に、四分位範囲の観点からデータ抽出の下限値および上限値を算出し、その範囲を満たすデータを抽出したい。

例えば下記のirisのデータを用いて、

python

1from sklearn.datasets import load_iris 2import pandas as pd 3 4iris = load_iris() 5 6df = pd.DataFrame(iris.data, columns=iris.feature_names) 7df.describe().round(1) 8 9# データの抽出条件を求める(describe()で得られる25%タイル値と75%タイル値を利用する) 10# 抽出条件は、下限値=第1四分位値 - 1.5 x 四分位範囲、上限値=第3四分位値 + 1.5 x 四分位範囲 11cols = df.columns 12iris_25 = [] 13iris_75 = [] 14for col in cols: 15 iris_25.append(df[col].describe()[4]) # 第1四分位値 16 iris_75.append(df[col].describe()[6]) # 第3四分位値 17 18# 四分位範囲を求め、リストに格納 19iris_IQR_list = [] 20for i in range(4): 21 iris_IQR_list.append(iris_75[i] - iris_25[i]) 22 23# 下限値、上限値の算出 24iris_lower_Q = [] 25iris_higher_Q = [] 26for i in range(4): 27 iris_lower_Q.append(iris_25[i] - 1.5*iris_IQR_list[i]) 28 iris_higher_Q.append(iris_75[i] + 1.5*iris_IQR_list[i]) 29 30# 上記で算出した下限値、上限値の間に入る値を元のデータフレームから抽出する 31for i, col in zip(range(4), cols): 32 (iris_lower_Q[i] < df[col]) & (df[col] < iris_higher_Q[i])

最終行のコードから、条件を満たすbool型が得られたのですが、これをどうやって元のデータフレームに適用すればいいのか(どうやったら抽出できるのか)分かりません。
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のようにすれば、列ごとに計算しなくても[Q1 - 1.5 * IQR, Q3 + 1.5 * IQR] の範囲の値をまとめて抽出できます。
範囲外の値は NaN になります。

python

1from sklearn.datasets import load_iris 2import pandas as pd 3 4iris = load_iris() 5df = pd.DataFrame(iris.data, columns=iris.feature_names) 6 7q1 = df.quantile(q=0.25) 8q3 = df.quantile(q=0.75) 9iqr = q3 - q1 10 11# 抽出する 12df2 = df[(q1 - 1.5 * iqr <= df) & (df <= q3 + 1.5 * iqr)]

サンプル

python

1df = pd.DataFrame({"A": [1, 2, 3, 4], "B": [2, 3, 4, 5]}) 2lower = pd.Series({"A": 2, "B": 3}) 3upper = pd.Series({"A": 3, "B": 4}) 4 5# 抽出する 6df2 = df[(lower <= df) & (df <= upper)] 7print(df2) 8# A B 9# 0 NaN NaN 10# 1 2.0 3.0 11# 2 3.0 4.0 12# 3 NaN NaN

投稿2020/08/28 13:28

tiitoi

総合スコア21956

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

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

yakinikuteishok

2020/08/28 15:59

早速のレスポンスありがとうございます。 そして、こんなにも簡単にできてしまうとは、、、 非常に勉強になりましたし、助かりました。 どうもありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問