今回は、Pythonのデータ分析ライブラリ「Pandas」を使って、特定の列や行を抽出する方法について解説します。
DataFrameから欲しいデータだけを取り出すために、知っておきたい基本操作をまとめました。
サンプルデータの作成
import pandas as pd
df = pd.DataFrame({
"名前": ["太郎", "花子", "次郎", "美香", "健一", "恵子", "翔", "茜", "隆", "葵"],
"年齢": [23, 29, 35, 42, 18, 33, 27, 24, 31, 30],
"職業": ["エンジニア", "デザイナー", "教師", "医師", "学生", "看護師", "プログラマー", "販売員", "弁護士", "研究者"],
"年収(円)": [4500000, 5500000, 4900000, 7300000, 0, 4000000, 6000000, 3200000, 8000000, 5800000],
"居住地": ["東京", "大阪", "名古屋", "札幌", "福岡", "東京", "神戸", "仙台", "横浜", "千葉"],
"勤続年数": [2, 4, 10, 15, 1, 5, 3, 1, 12, 8]
})
df
名前 | 年齢 | 職業 | 年収(円) | 居住地 | 勤続年数 | |
---|---|---|---|---|---|---|
0 | 太郎 | 23 | エンジニア | 4500000 | 東京 | 2 |
1 | 花子 | 29 | デザイナー | 5500000 | 大阪 | 4 |
2 | 次郎 | 35 | 教師 | 4900000 | 名古屋 | 10 |
3 | 美香 | 42 | 医師 | 7300000 | 札幌 | 15 |
4 | 健一 | 18 | 学生 | 0 | 福岡 | 1 |
5 | 恵子 | 33 | 看護師 | 4000000 | 東京 | 5 |
6 | 翔 | 27 | プログラマー | 6000000 | 神戸 | 3 |
7 | 茜 | 24 | 販売員 | 3200000 | 仙台 | 1 |
8 | 隆 | 31 | 弁護士 | 8000000 | 横浜 | 12 |
9 | 葵 | 30 | 研究者 | 5800000 | 千葉 | 8 |
特定列の抽出
1列だけ抽出
df['名前']
出力例:
名前 | |
---|---|
0 | 太郎 |
1 | 花子 |
2 | 次郎 |
3 | 美香 |
4 | 健一 |
5 | 恵子 |
6 | 翔 |
7 | 茜 |
8 | 隆 |
9 | 葵 |
※このように、DataFrameの中の「名前」列だけが順番に取り出されます。
複数列を抽出
df[['名前', '年収(円)']]
名前 | 年収(円) | |
---|---|---|
0 | 太郎 | 4500000 |
1 | 花子 | 5500000 |
2 | 次郎 | 4900000 |
3 | 美香 | 7300000 |
4 | 健一 | 0 |
5 | 恵子 | 4000000 |
6 | 翔 | 6000000 |
7 | 茜 | 3200000 |
8 | 隆 | 8000000 |
9 | 葵 | 5800000 |
特定行の抽出
範囲指定(インデックス番号)
df[0:1] # 1行目のみ
名前 | 年齢 | 職業 | 年収(円) | 居住地 | 勤続年数 | |
---|---|---|---|---|---|---|
0 | 太郎 | 23 | エンジニア | 4500000 | 東京 | 2 |
df[0:3] # 1〜3行目まで(0,1,2行目が対象)
名前 | 年齢 | 職業 | 年収(円) | 居住地 | 勤続年数 | |
---|---|---|---|---|---|---|
0 | 太郎 | 23 | エンジニア | 4500000 | 東京 | 2 |
1 | 花子 | 29 | デザイナー | 5500000 | 大阪 | 4 |
2 | 次郎 | 35 | 教師 | 4900000 | 名古屋 | 10 |
失敗談
行毎や列毎に抜き出せるなら、df[0:3, ['列1', '列2']]
のように、行と列を同時に抜き出すことを試みましたが、できませんでした。この場合は、後述するloc
を使いましょう。
locの利用(ラベル名指定)
特定列を抽出
df.loc[:, '名前'] # 全行から「名前」列のみ
名前 | |
---|---|
0 | 太郎 |
1 | 花子 |
2 | 次郎 |
3 | 美香 |
4 | 健一 |
5 | 恵子 |
6 | 翔 |
7 | 茜 |
8 | 隆 |
9 | 葵 |
df.loc[:, ['名前', '年収(円)']] # 全行から「名前」と「年収(円)」列を選択
名前 | 年収(円) | |
---|---|---|
0 | 太郎 | 4500000 |
1 | 花子 | 5500000 |
2 | 次郎 | 4900000 |
3 | 美香 | 7300000 |
4 | 健一 | 0 |
5 | 恵子 | 4000000 |
6 | 翔 | 6000000 |
7 | 茜 | 3200000 |
8 | 隆 | 8000000 |
9 | 葵 | 5800000 |
特定の行と列を抽出
df.loc[0:2, ['名前', '年収(円)']] # 先頭3行&特定列だけ抽出
名前 | 年収(円) | |
---|---|---|
0 | 太郎 | 4500000 |
1 | 花子 | 5500000 |
2 | 次郎 | 4900000 |
失敗談
次のようなコードを書いてしまい、エラーが出ました。
df.loc[0:3, '名前', '年齢'] # 間違い:列はリストで指定すべき
正しくは、以下のように列名はリスト形式
で渡す必要があるのです:
df.loc[0:3, ['名前', '年齢']]
このミスはとても初歩的ですが、何度も繰り返してしまいました。その結果、私はloc
の使い方について、メモ帳に「行は範囲指定、列はリスト」と書いて貼っておくようにしました。
改善策: コードの構文エラーが出たら「一度、公式ドキュメントを確認する」「列名は必ずリストにする」ことを徹底する。
とはいえ、初心者のうちは、間違えるのが当たり前。焦らず確認を重ねることが大切です。
▶️ locの公式ドキュメントも参考にしてください:
pandas DataFrame loc Documentation
df.columns や df.index を併用しよう
DataFrameの構造確認にも便利な属性です。
df.columns
:データフレームの列名を確認できます。df.index
:インデックス(行ラベル)を確認できます。
# カラム名を一覧表示
df.columns
# 出力例: Index(['名前', '年齢', '職業', '年収(円)', '居住地', '勤続年数'], dtype='object')
# インデックス情報を確認
df.index
# 出力例: RangeIndex(start=0, stop=10, step=1)
▶️ columnsとindexの公式ドキュメントも参考にしてください:
pandas DataFrame columns Documentation
pandas DataFrame index Documentation
まとめ
- 列だけを抽出 →
df['列名']
またはdf[['列1', '列2']]
- 行だけを抽出 →
df[0:3]
(インデックス番号指定) - 行と列を細かく指定 →
df.loc[行範囲, 列範囲]
を使う - 構造確認には
df.columns
やdf.index
も活用しよう!
次回は、インデックス番号で選択できるiloc
について詳しく解説します。
(locはラベル名、ilocは番号ベース。使い分けができるとさらに便利です!)
コメント