こんにちはid:hirokikyです。
今回はpandasのデータフレームから特定行を抜き出す処理に関する質問を紹介します。
質問
pandasのデータフレーム
df
について、df[df["y"]==1]["x"]
としたとき1個目と2個目の、df
の違いが分かりません。 また、なぜdf
が2つも必要なのでしょうか。 データフレームから特定行を抜き出す処理の意味が腑に落ちません。
>>> df = pandas.DataFrame([ ... [160, 1], ... [155, 0], ... [172, 1], ... [152, 0] ... ], columns=["x", "y"]) ... >>> df x y 0 160 1 1 155 0 2 172 1 3 152 0 >>> df[df["y"] == 1]["x"] 0 160 2 172 Name: x, dtype: int64
回答
ご質問の「2つのdf」というのは以下の2つということですね。
- df[...]["x"]
- df["y"]==1
一度に df[df["y"] == 1]["x"]
を考えると混乱しますので、順番に考えていきましょう。
まずこの処理全体での結果の意味は何でしょうか?
結果は、 y が、1 である行の、 x の値が取得できています。
>>> df[df["y"] == 1]["x"] 0 160 2 172 Name: x, dtype: int64
ここで ["x"]
を外すと以下のように y
が 1
の行だけを絞り込んだデータフレームになります。
>>> df[df["y"] == 1] x y 0 160 1 2 172 1
df["y"] == 1
について
ではここで df["y"] == 1
とはなんでしょうか?
実行してみると以下のような True
と False
が並んだシリーズ(リストのような値)になります。
>>> df["y"] == 1 0 True 1 False 2 True 3 False Name: y, dtype: bool
このシリーズを df[...]
に渡すことで y
が 1
の行だけで絞り込んだデータフレームが取得できました。
df[...]でTrueの行だけを抜き出す
pandasでは、df[..]
にTrueかFalseのリスト(やシリーズ)を渡すことで、Trueになっている行だけを抜き出せます。
たとえばrows = [True, True, False, True]
という True
と False
を含んだリストで試してみましょう。
結果として、df
から3つの行を抜き出したデータフレームになります。
>>> df[rows] x y 0 160 1 1 155 0 3 152 0
これは rows
が True
である、1行目、2行目、4行目を抜き出したデータフレームになっています。
まとめ
まとめると df[df["y"] == 1]["x"]
は以下になります。
df["y"]==1
は、y
が1
になる行の場所だけTrue
になったシリーズを取得するdf[...]
に渡すことで、y
が1
の行だけ抜き出したデータフレームを取得するy
が1
の行から、...["x"]
によってx
の値を取得する
もし挙動について疑問が湧いたときは、このように1つ1つ分解して動作させてみると新たな発見ができるかもしれません。
PyQで学習中は想定した以外のプログラムを動作させても問題ありません。ぜひ、色々実験して発見してみてください。