PandasのDataFrameで作成した表から、指定した要素を抜き出す方法と指定した要素の値を変更する方法を、パターン別に実例を用いて解説しています。
はじめに
DataFrameの表から行・列・値を取得したり変更する実例として、以下のような 4行4列で作成した表を用いて解説しています。
使用する表
DataFrameで作成した表を変数dfに代入しています。
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
listB = ['EEE', 'FFF', 'GGG', 'HHH']
listC = ['III', 'JJJ', 'KKK', 'LLL']
listD = ['MMM', 'NNN', 'OOO', 'PPP']
lists = [listA, listB, listC, listD]
df = pd.DataFrame(lists)
df.columns = ['aaa', 'bbb', 'ccc', 'ddd']
df.index = [111,222,333,444]
print( df )
#出力
aaa bbb ccc ddd
111 AAA BBB CCC DDD
222 EEE FFF GGG HHH
333 III JJJ KKK LLL
444 MMM NNN OOO PPP
表の作成方法や行名や列名を変更する方法は以下をご参考ください。
列のデータを抽出する方法
列を抽出する方法は大きく3つあります。
列名一覧を抽出する方法
.columnsメソッドを使用します。
- 列名一覧の抽出
- 出力はIndex/Int64Index型など
- 列のタイプ(dtype)も出力
df.columns
#出力
# Index(['aaa', 'bbb', 'ccc', 'ddd'], dtype='object')
出力はIndex型になります。Index型とは、DataFrameの見出し(ラベル)のオブジェクトです。
Index型をlist型(配列)に変換
Index型はlist型変換することができます。変換はlist関数を使います。
list(df.columns)
#出力
# ['aaa', 'bbb', 'ccc', 'ddd']
指定した列番号の見出しのみ出力する方法
指定した列番号の見出しのみ出力することもできます。
df.columns[n]
└「n」:配列番号列番号で抽出
df.columns[2]
#出力
# 'ccc'
列名で抽出する方法
列名を使って指定した列のデータを抽出することができます。主に以下の3つがあります。
※dfは表データが入った変数です。
※df.列名 の列名にクオテーションや、カッコは不要です。列名そのままを記述しないとエラーになります。
df[‘列名’] で抽出
df['bbb']
#出力
111 EEE
222 FFF
333 GGG
444 HHH
Name: bbb, dtype: object
df.列名 で抽出
df.bbb
#出力
111 EEE
222 FFF
333 GGG
444 HHH
Name: bbb, dtype: object
※文字列でもクオテーションは不要です。つけるとエラーになります。
df.'bbb'
#出力
# invalid syntax
locメソッド で抽出
df.loc[:, ['列名1', '列名2',,,]]
- loc[ ]:locメソッド
- 「:,」:行名指定なし
- [‘列名1’, ‘列名2’,,,]:抽出したい列名を指定。
df.loc[:, ['bbb', 'ccc']]
bbb ccc
111 EEE III
222 FFF JJJ
333 GGG KKK
444 HHH LLL
※列が1つの場合は[ ]はあってもなくても機能します。以下は同じ処理になります。df.loc[:, 'aaa']
=df.loc[:, ['aaa']]
列番号で抽出
列番号で抽出するためにはilocメソッドを使います。
iloc[:,[n,x,,,]]
- iloc[ ] :列番号で指定
- :, :行の指定はなし
- 「n」「x」:列番号
※注意 スライス[n:x]は使えません(エラーになります)
df.iloc[:, [1,2]]
#出力
bbb ccc
111 EEE III
222 FFF JJJ
333 GGG KKK
444 HHH LLL
※列が1つの場合は[ ]はあってもなくても機能します。以下は同じ処理になります。df.iloc[:, 'aaa']
=df.iloc[:, ['aaa']]
▼1列のみ抽出する場合
以下の2つは同じ出力結果になります。
df.iloc[:, 2]
#出力
111 III
222 JJJ
333 KKK
444 LLL
Name: ccc, dtype: object
df.iloc[:, [2]]
#出力
ccc
111 III
222 JJJ
333 KKK
444 LLL
行のデータを抽出する方法
行名一覧を抽出する方法
indexメソッドを使用します。
- 列名一覧の抽出
- 出力はIndex/Int64Index型など
- 列のタイプ(dtype)も出力
df.index
#出力
# Int64Index([111, 222, 333, 444], dtype='int64')
列名が数値の場合、出力はInt64Index型になります。Int64Index型とは、DataFrameの見出し(ラベル)が数値の場合のオブジェクトです。
文字列の時は、Index型になります。
Int64Index型をlist型(配列)に変換
Int64Index型はlist型変換することができます。変換はlist関数を使います。
list(df.index)
#出力
# [111, 222, 333, 444]
指定した行番号の見出しのみ出力する方法
指定した行番号の見出しのみ出力することもできます。
df.index[n]
└「n」:行番号行番号で抽出
df.index[2]
#出力
# '333'
行名で抽出する方法
行名を指定してデータを抽出するには、locメソッドを使います。
df.loc[[‘aaa’, ‘bbb’,,,,]]
└「df」:表の入った変数
└「.loc[ ]」:行・列名を指定する方法
└ 「aaa」「bbb」:行名行名で抽出
df.loc[[111,333,444]]
#出力
aaa bbb ccc ddd
111 AAA EEE III MMM
333 CCC GGG KKK OOO
444 DDD HHH LLL PPP
指定した行以降を抽出する方法
locメソッドの列名の指定で、[行名:] とすると、指定した行以降のデータをすべて抽出することができます。
df.loc[行名:]
df.loc[333:]
#出力
aaa bbb ccc ddd
333 CCC GGG KKK OOO
444 DDD HHH LLL PPP
1行のみ抽出する場合は記述方法が2パターンあります。df.iloc[[n]]
df.iloc[n]
[ ]の数の差。それぞれで出力結果が異なります。2重カッコ df.iloc[[n]]の方が出力は見やすいです。
▼df.loc[[111]]
の例
df.loc[[111]]
#出力
aaa bbb ccc ddd
111 AAA EEE III MMM
▼df.loc[111]
の例
df.loc[111]
#出力
aaa AAA
bbb EEE
ccc III
ddd MMM
Name: 111, dtype: object
行番号で抽出する方法
行番号で抽出するには以下の2つの方法が使えます。
スライスを使って指定する方法|df[n:m:l]
スライスを使って抽出する行を指定することができます。
df[n:m:l]
- 「df」:表の入った変数
- 「n」:開始値
- 「m」:終わり値
- 「l」:変化量
「n」と「l」は省略可能です。
スライスの使い方については以下をご参考ください。
【Pyhton】スライスとは何か?配列(list)や文字列(str)範囲指定がとても簡単!使い方を実例でパターン別にわかりやすく解説
例:開始列と終了列の番号を指定
df[1:3]
1~2行目までを抽出。
3行目は含まない(3行目で処理終了のため)行の抽出
df[1:3]
#出力
aaa bbb ccc ddd
222 BBB FFF JJJ NNN
333 CCC GGG KKK OOO
例:変化量を指定して抜き出す
df[1:5:2]
1~4行目までで、2づつ増加した番号の行を抜き出す。行の抽出
df[1:5:2]
#出力
aaa bbb ccc ddd
222 BBB FFF JJJ NNN
444 DDD HHH LLL PPP
例:初期値を省略した場合
初期値=0とみなされ、上から指定した番号(の一つ前)までの行を抽出できます。
df[:3]
- 0~2行目まで抽出。
- df[0:3]と同じ処理。
df[:3]
#出力
aaa bbb ccc ddd
111 AAA EEE III MMM
222 BBB FFF JJJ NNN
333 CCC GGG KKK OOO
ilocメソッドを使って指定する|df.iloc[[n,m,,,,]]
df.iloc[[n,m,,,]]
- df :表の入った変数
- .iloc[ ] :行・列番号で指定するメソッド
- 「n」「m」:行番号の指定
※行番号を囲む[ ]は必須
※スライスは使えない
例:df.iloc[[1,3]]
df.iloc[[1,3]]
#出力
aaa bbb ccc ddd
222 BBB FFF JJJ NNN
444 DDD HHH LLL PPP
1行のみ抽出する場合
1行のみ抽出する場合は記述方法が2パターンあります。df.iloc[[n]]
df.iloc[n]
[ ]の数の差。それぞれで出力結果が異なります。2重カッコ df.iloc[[n]]の方が出力は見やすいです。
▼例:df.iloc[[n]]
2重カッコの場合の出力。行番号で指定
df.iloc[[3]]
#出力
aaa bbb ccc ddd
444 DDD HHH LLL PPP
▼例:df.iloc[n]
1重カッコの場合の出力。行番号で指定
df.iloc[3]
#出力
aaa DDD
bbb HHH
ccc LLL
ddd PPP
Name: 444, dtype: object
表の要素やセルの値を抽出する方法
表の各セルの値を抽出するメソッドは4つあります。
大きく「loc」と「at」の2つに分類できる
・「loc」:範囲で指定。行や列の複数取得もできる。
・「at」:ピンポイントで1つのセルの値だけ取得。
〇補足:「at」の方が高速です。
「i」の有無
冒頭の「i」のあるなしで、名前で指定か番号で指定するかが変わります。
・なし:行列名
・あり:行列番号
抽出元の表
各メソッドを実行する元の表は以下になります。
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
listB = ['EEE', 'FFF', 'GGG', 'HHH']
listC = ['III', 'JJJ', 'KKK', 'LLL']
listD = ['MMM', 'NNN', 'OOO', 'PPP']
lists = [listA, listB, listC, listD]
df = pd.DataFrame(lists)
df.columns = ['aaa', 'bbb', 'ccc', 'ddd']
df.index = [111,222,333,444]
print( df )
#出力
aaa bbb ccc ddd
111 AAA BBB CCC DDD
222 EEE FFF GGG HHH
333 III JJJ KKK LLL
444 MMM NNN OOO PPP
locメソッド
df.loc['行名','列名']
df.loc[333,'bbb']
#出力
# 'GGG'
iloc
df.iloc['行番号','列番号']
df.iloc[2,1]
#出力
# 'GGG'
at
df.at['行名','列名']
df.at[333,'bbb']
#出力
# 'GGG'
iat
df.at['行番号','列番号']
df.iat[2,1]
#出力
# 'GGG'
表の中のデータを変更する方法
表の中のデータは、要素を指定をして代入することでデータを入れ替えることができます。
大きく「loc」と「at」の2つに分類できる
・「loc」:範囲で指定。行や列の複数取得もできる。
・「at」:ピンポイントで1つのセルの値だけ取得。
〇補足:「at」の方が高速です。
「i」の有無
冒頭の「i」のあるなしで、名前で指定か番号で指定するかが変わります。
・なし:行列名
・あり:行列番号
抽出元の表
各メソッドを実行する元の表は以下になります。
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
listB = ['EEE', 'FFF', 'GGG', 'HHH']
listC = ['III', 'JJJ', 'KKK', 'LLL']
listD = ['MMM', 'NNN', 'OOO', 'PPP']
lists = [listA, listB, listC, listD]
df = pd.DataFrame(lists)
df.columns = ['aaa', 'bbb', 'ccc', 'ddd']
df.index = [111,222,333,444]
print( df )
#出力
aaa bbb ccc ddd
111 AAA BBB CCC DDD
222 EEE FFF GGG HHH
333 III JJJ KKK LLL
444 MMM NNN OOO PPP
loc
df.loc[333,'bbb'] = '@@@'
df
#出力
aaa bbb ccc ddd
111 AAA EEE III MMM
222 BBB FFF JJJ NNN
333 CCC @@@ KKK OOO
444 DDD HHH LLL PPP
iloc
df.iloc[2,1] = '★★'
df
#出力
aaa bbb ccc ddd
111 AAA EEE III MMM
222 BBB FFF JJJ NNN
333 CCC ★★ KKK OOO
444 DDD HHH LLL PPP
at
df.at[333,'bbb'] = 999
df
#出力
aaa bbb ccc ddd
111 AAA EEE III MMM
222 BBB FFF JJJ NNN
333 CCC 999 KKK OOO
444 DDD HHH LLL PPP
iat
df.iat[2,1] = '※※'
df
#出力
aaa bbb ccc ddd
111 AAA EEE III MMM
222 BBB FFF JJJ NNN
333 CCC ※※ KKK OOO
444 DDD HHH LLL PPP
行名、列名を変更する方法
行名、列名を指定する方法は、表を作成する時に変更する方法と、既存の表のデータを変更する方法があります。
①表作成時に変更する方法
DataFrameのオプションを使用
・列:columnsオプション
・行:indexオプション
②既存の表データを変更する方法(一括変更)
・列:columnsメソッド
・行:indexメソッド
③既存の表データを変更する方法(変更したい行・列を指定する)
・renameメソッド
└「columns={ }」:列名を変更
└「index={ }」:行名を変更
行名と列名の変更の詳細は以下ページをご参考ください。
参考リンク
- 【Python】Pandas表データに名前を付けてCSVファイルで出力する方法
- 【Python】出力するデータのファイル名を自動でユニークにする方法
- 【Python】表データの作成&行と列の名前を変更する方法
- 【Python】表から行・列・値を取得&変更する方法を実例で解説
Pandasモジュール 公式ページのリンク