Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

pandasのデータフレームから特定行を抜き出す処理の意味がわかりません、への回答

f:id:kenken0326:20200519151953p:plain

こんにちは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つということですね。

  1. df[...]["x"]
  2. 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"] を外すと以下のように y1 の行だけを絞り込んだデータフレームになります。

>>> df[df["y"] == 1]
     x  y
0  160  1
2  172  1

df["y"] == 1 について

ではここで df["y"] == 1 とはなんでしょうか?
実行してみると以下のような TrueFalse が並んだシリーズ(リストのような値)になります。

>>> df["y"] == 1
0     True
1    False
2     True
3    False
Name: y, dtype: bool

このシリーズを df[...] に渡すことで y1 の行だけで絞り込んだデータフレームが取得できました。

df[...]でTrueの行だけを抜き出す

pandasでは、df[..] にTrueかFalseのリスト(やシリーズ)を渡すことで、Trueになっている行だけを抜き出せます。

たとえばrows = [True, True, False, True] という TrueFalse を含んだリストで試してみましょう。
結果として、df から3つの行を抜き出したデータフレームになります。

>>> df[rows]
     x  y
0  160  1
1  155  0
3  152  0

これは rowsTrue である、1行目、2行目、4行目を抜き出したデータフレームになっています。

まとめ

まとめると df[df["y"] == 1]["x"] は以下になります。

  • df["y"]==1は、y1 になる行の場所だけ True になったシリーズを取得する
  • df[...] に渡すことで、 y1 の行だけ抜き出したデータフレームを取得する
  • y1 の行から、 ...["x"] によって x の値を取得する

もし挙動について疑問が湧いたときは、このように1つ1つ分解して動作させてみると新たな発見ができるかもしれません。
PyQで学習中は想定した以外のプログラムを動作させても問題ありません。ぜひ、色々実験して発見してみてください。

Copyright ©2017- BeProud Inc. All rights reserved.