pythonでデータ分析をする際によく使われるpandas。
pandas.DataFrameから特定のデータを抽出して加工したい場合がありますよね。
この記事ではpandas.DataFrameからデータを抽出する方法を紹介します。
pandas.DataFrameからデータを抽出する方法
pandas.DataFrameでデータを抽出する方法は次のようなものがあります。
コードがシンプルなスライスがおすすめです。
- 直感的に行・列を抽出: スライス
- 条件に一致する行を抽出する: query()
- インデックス名・カラム名で行・列を抽出: loc[]
- インデックス・カラム番号で行・列を抽出する: iloc[]
- インデックスとカラム名を指定してデータを抽出: at[]
- インデックスとカラムの番号を指定してデータを抽出: iat[]
この記事のコードは全てグーグルコラボラトリーで記述・動作を確認しています。
準備
最初にpandasをインポートします。
import pandas as pd
今回はとある生徒達のテスト結果を使って抽出を紹介します。
point_list = [[51, 70, 35, 90, 100],
[21, 0, 55, 50, 92],
[14, 74, 23, 67, 44],
[56, 29, 91, 66, 62],
[89, 55, 73, 98, 60],
[6, 22, 29, 78, 67],
[34, 53, 20, 53, 43]]
point_data = pd.DataFrame(data=point_list, columns=['国語', '数学', '英語', '理科', '社会'], index=['A', 'B', 'C', 'D', 'E', 'F', 'G'])
point_data.head()
出力:
index | 国語 | 数学 | 英語 | 理科 | 社会 |
---|---|---|---|---|---|
A | 51 | 70 | 35 | 90 | 100 |
B | 21 | 0 | 55 | 50 | 92 |
C | 14 | 74 | 23 | 67 | 44 |
D | 56 | 29 | 91 | 66 | 62 |
E | 89 | 55 | 73 | 98 | 60 |
直感的に行・列を抽出: スライス
pandasで行や列を抽出するお手軽な方法はスライスです。
スライスはdataFrame[ ]で角括弧内に行や列を指定するとデータをserieseの形で抽出します。
seriese_math = point_data['数学']
seriese_math
出力:
A 70
B 0
C 74
D 29
E 55
F 22
G 53
Name: 数学, dtype: int64
また、DataFrame[[‘カラム名’]]と記述するとDataFrameの形で抽出します。
複数の列を抽出する場合はコンマで区切ってカラム名を複数記述します。
data_mathsoc = point_data[['数学', '社会']]
data_mathsoc
出力:
index | 数学 | 社会 |
---|---|---|
A | 70 | 100 |
B | 0 | 92 |
C | 74 | 44 |
D | 29 | 62 |
E | 55 | 60 |
F | 22 | 67 |
G | 53 | 43 |
同様に行を指定して抽出することも可能です。
行を抽出する場合は[開始の行:終わりの行]の2つの値を入力する必要があります。
data_atoc = point_data['A':'C']
data_atoc
出力:
index | 国語 | 数学 | 英語 | 理科 | 社会 |
---|---|---|---|---|---|
A | 51 | 70 | 35 | 90 | 100 |
B | 21 | 0 | 55 | 50 | 92 |
C | 14 | 74 | 23 | 67 | 44 |
もし1行のみ抽出したい場合は、開始の行と終わりの行に同じインデックス名を入力します。
data_d = point_data['D':'D']
data_d
出力:
index | 国語 | 数学 | 英語 | 理科 | 社会 |
---|---|---|---|---|---|
D | 56 | 29 | 91 | 66 | 62 |
条件を指定して、その条件を満たすデータのみ抽出することが可能です。
スライスする行に条件を設定すると、各列がその条件を満たしているかどうかをbool型(true, false)で返します。
この条件をDataFrame[]で囲むことで、条件を満たす行のみを抽出します。
bool_math = point_data['数学'] > 50
bool_math
出力:
A True
B False
C True
D False
E True
F False
G True
Name: 数学, dtype: bool
この条件をDataFrame[]で囲むことで、条件を満たす行のみを抽出します。
hipo_math = point_data[point_data['数学'] > 50]
hipo_math
出力:
index | 国語 | 数学 | 英語 | 理科 | 社会 |
---|---|---|---|---|---|
A | 51 | 70 | 35 | 90 | 100 |
C | 14 | 74 | 23 | 67 | 44 |
E | 89 | 55 | 73 | 98 | 60 |
G | 34 | 53 | 20 | 53 | 43 |
条件に一致する行を抽出する: query()
query()関数を使用することで、設定した列の条件を満たす行データを抽出できます。
カッコの中に列に対する条件を文字列で記述すると使用可能です。
国語の点数が50点よりも高い生徒の各テスト結果をquery()で抽出してみましょう。
point_data.query('国語 > 50')
出力:
index | 国語 | 数学 | 英語 | 理科 | 社会 |
---|---|---|---|---|---|
A | 51 | 70 | 35 | 90 | 100 |
D | 56 | 29 | 91 | 66 | 62 |
E | 89 | 55 | 73 | 98 | 60 |
インデックス名・カラム名で行・列を抽出: loc[]
loc[]はインデックス名もしくはカラム名で参照して行や列を抽出します。
pandas.DataFrame.loc[‘インデックス名’]を指定することで、データの抽出が可能です。
それでは、Aさんのテスト結果を抽出します。
seloc_A = point_data.loc['A']
seloc_A
出力:
国語 51
数学 70
英語 35
理科 90
社会 100
Name: A, dtype: int64
ちなみにloc[[‘インデックス名’]]で、抽出結果をDataFrameの形で返します。
dfloc_A = point_data.loc[['A']]
dfloc_A
出力:
index | 国語 | 数学 | 英語 | 理科 | 社会 |
---|---|---|---|---|---|
A | 51 | 70 | 35 | 90 | 100 |
角カッコ内の記述方法にルールがあり、インデックス名, カラム名の順番に記述する必要があります。
指定したカラムのみ抽出したい場合は、loc[:, ‘カラム名’]です。
各生徒の数学の結果を抽出します。
loc_math = point_data.loc[:, '数学']
loc_math
出力:
A 70
B 0
C 74
D 29
E 55
F 22
G 53
Name: 数学, dtype: int64
カラム名に対して指定した条件で抽出することが可能です。
条件の指定はスライスを使って記述する必要があります。
数学の点数が60より高い生徒の各教科の結果を抽出してみましょう。
hiloc_math = point_data.loc[point_data['数学'] > 60]
hiloc_math
出力:
index | 国語 | 数学 | 英語 | 理科 | 社会 |
---|---|---|---|---|---|
A | 51 | 70 | 35 | 90 | 100 |
C | 14 | 74 | 23 | 67 | 44 |
インデックス・カラム番号で行・列を抽出する: iloc[]
pandas.DataFrame.iloc[]は行番号、列番号を記入してデータを抽出できます。
1列目 (今回の表では国語とAさん)の番号は0である点に注意してください。
試しにBさんのテスト結果を抽出します。
dfiloc_be = point_data.iloc[[1,4]]
dfiloc_be
出力:
index | 国語 | 数学 | 英語 | 理科 | 社会 |
---|---|---|---|---|---|
B | 21 | 0 | 55 | 50 | 92 |
E | 89 | 55 | 73 | 98 | 60 |
列で抽出する方法や条件を指定する方法などはloc[]と同様です。
インデックスとカラム名を指定してデータを抽出: at[]
pandas.DataFrame.at[]の角括弧内にインデックスとカラム名を指定することで、データを抽出できます。
スライスやloc、ilocでもインデックスとカラムを指定すればデータを抽出可能ですが、at[]や次に紹介するiat[]で抽出する方が処理スピードが速いです。
Aさんの国語の点数を抽出してみます。
a_jap = point_data.at['A', '国語']
a_jap
出力:
51
インデックスとカラムの番号を指定してデータを抽出: iat[]
pandas.DataFrame.iat[]の角括弧内に対応するインデックスとカラムの番号を記述すると指定したデータを抽出可能です。
iloc[]の時と同じく、1行目・1列目は0であることに注意です。
Dさんの社会の点数を抽出します。
d_soc = point_data.iat[3, 4]
d_soc
出力:
62
まとめ
今回はpandasでデータを抽出する方法を紹介しました。
スライスでの操作が簡単でおすすめですが、インデックスの指定がわかりづらいので、loc[]も使用するとわかりやすくなります。
この記事を読んでpythonをより勉強したいと思った人はこの記事で勉強方法も確認してみましょう。
コメント