2018/02/01

2020/04/14

pandasのデータフレームの要素を参照する【Python3】

Python

ライター:

当記事では、pandasのデータフレーム(DataFrame)の要素を参照する方法を紹介いたします(Python3)。こちらのcsvファイル→サンプルcsvファイルを説明用に使うので、同じことがしたい方はダウンロードして使ってください!

まずはデータを読み込みます。

import pandas as pd #pandasをpdとしてインポート

#データをdfに読み込み。
df = pd.read_csv("sample.csv")

#dfの中身を確認
print(df)

今回使うデータは以下のような形になっています。

   number  age  blood_pressure  lung_capacity sex  weight  disease
0       1   22             110           4300   M      79        1
1       2   23             128           4500   M      65        1
2       3   24             104           3900   F      53        0
3       4   25             112           3000   F      45        0
4       5   27             108           4800   M      80        0

列名、行名による要素の参照

pandasでは、変数名の後に[]をつけて列名、行名の順番に指定すれば任意の要素を取り出すことが出来ます。df[“列名”][“行名”]というような感じで記述してください。

3列目(lung_capacityの列)を取り出したい場合。

df["lung_capacity"]

0    4300
1    4500
2    3900
3    3000
4    4800

複数列取り出したい場合は、列名をリストにします。

df[["lung_capacity","weight"]]

    lung_capacity  weight
0            4300      79
1            4500      65
2            3900      53
3            3000      45
4            4800      80

行も指定したい場合。

df["lung_capacity"][3]

3000

複数行の指定。

df["lung_capacity"][1:4]

1    4500
2    3900
3    3000

補足になりますが、『1:4』は、1以上4未満という意味です。

ちなみに、指定した列名、行名ないと次のようなエラーメッセージがでます。

df[3]

KeyError: 3

『df[“列名”]』の代わりに『df.列名』でも同様に列を参照することができます。

df.weight

0    79
1    65
2    53
3    45
4    80

スライスによる行の参照

スライスとは、pythonのリストの要素を参照する際に使うテクニックです。

変数名[◯:△:□]

で、リストの◯以上△未満の要素について□個おきに取得すると言う意味です。(◯:開始位置、△:終了位置、□:間隔)

例えば、

list1[2:10:2]

なら、2以上10未満2個おきなので、(2が開始、10が終了、2個間隔)

2番目、4番目、6番目、8番目

の要素が参照されることになります。(python界では0番目から要素を数え始めることには気をつけましょう。)

pandasではこのスライスによってデータフレームを横に切ることができます。3行目以上5行目未満を参照する場合、

df[3:5]

   number  age  blood_pressure  lung_capacity sex  weight  disease
3       4   25             112           3000   F      45        0
4       5   27             108           4800   M      80        0

df[“列名”][“行名”]の時と違い、一つ目の[]が行の番号を指定ので混同しないように注意が必要です。

2行目以降全部を参照する場合。

df[2:]

   number  age  blood_pressure  lung_capacity sex  weight  disease
2       3   24             104           3900   F      53        0
3       4   25             112           3000   F      45        0
4       5   27             108           4800   M      80        0

1行読み込んだら次の行はスキップする場合。

df[::2]

   number  age  blood_pressure  lung_capacity sex  weight  disease
0       1   22             110           4300   M      79        1
2       3   24             104           3900   F      53        0
4       5   27             108           4800   M      80        0

このようにpandasでもスライスが使えます。

.ilocを用いた行・列番号による指定

変数名.iloc[行番号,列番号]とすることで、番号を指定して要素そこにある要素を参照します。

0行目2列目の場合。

df.iloc[0,2]

110

もちろんここでもスライスが利用可。行は1行ごとにスキップ、列は1列目以上3列目未満の場合。

df.iloc[::2,1:3]

   age  blood_pressure
0   22             110
2   24             104
4   27             108

指定した条件にマッチする要素を参照

pandasはデータフレームごと比較演算子を適用して、各要素の真偽判定が可能です。

df == 3

   number    age  blood_pressure  lung_capacity    sex  weight  disease
0   False  False           False          False  False   False    False
1   False  False           False          False  False   False    False
2    True  False           False          False  False   False    False
3   False  False           False          False  False   False    False
4   False  False           False          False  False   False    False

これを応用して、例えば真の部分だけを残して、同じ形のデータフレームを作ることができます。

df[df == 3]

   number  age  blood_pressure  lung_capacity  sex  weight  disease
0     NaN  NaN             NaN            NaN  NaN     NaN      NaN
1     NaN  NaN             NaN            NaN  NaN     NaN      NaN
2     3.0  NaN             NaN            NaN  NaN     NaN      NaN
3     NaN  NaN             NaN            NaN  NaN     NaN      NaN
4     NaN  NaN             NaN            NaN  NaN     NaN      NaN

『.iloc』や『.列名』も合わせて利用すると、条件に合うデータだけを取り出せます。

23歳より年上の人のデータだけを取り出す場合。

df[df.iloc[:,1] > 23]

   number  age  blood_pressure  lung_capacity sex  weight  disease
2       3   24             104           3900   F      53        0
3       4   25             112           3000   F      45        0
4       5   27             108           4800   M      80        0
df[df.age>23]

   number  age  blood_pressure  lung_capacity sex  weight  disease
2       3   24             104           3900   F      53        0
3       4   25             112           3000   F      45        0
4       5   27             108           4800   M      80        0
(totalcount 26,834 回, dailycount 55回 , overallcount 16,392,979 回)

ライター:

Python

single-banner

COMMENT

コメントを残す

メールアドレスが公開されることはありません。
*は必須項目です。




CAPTCHA