【Python】表から行・列・値を取得&変更する方法を実例で解説

【Python】表から行・列・値を取得&変更する方法を実例で解説 Python
記事内に広告が含まれていることがあります。

PandasのDataFrameで作成した表から、指定した要素を抜き出す方法指定した要素の値を変更する方法を、パターン別に実例を用いて解説しています。

はじめに

DataFrameの表から行・列・値を取得したり変更する実例として、以下のような 4行4列で作成した表を用いて解説しています。

使用する表

DataFrameで作成した表を変数dfに代入しています。

【Python】表から行・列・値を取得&変更する方法のベースとなる表
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

表の作成方法や行名や列名を変更する方法は以下をご参考ください。

【Python】表データの作成&行と列の名前を変更する方法

列のデータを抽出する方法

列を抽出する方法は大きく3つあります。

列の抽出方法
  1. 列名一覧の抽出
  2. 列名で抽出
  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つがあります。

列名で抽出する方法
  1. df[‘列名’]
  2. df.列名
  3. df.loc[:, [‘列名’]]

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


行のデータを抽出する方法

列の抽出方法
  1. 行名一覧の抽出
  2. 行名で抽出
  3. 行番号で抽出

行名一覧を抽出する方法

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]
  • ilocメソッドを使って指定する。df.iloc[[n,m,,,,]]

スライスを使って指定する方法|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
  • iloc
  • at
  • iat

大きく「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'



表の中のデータを変更する方法

表の中のデータは、要素を指定をして代入することでデータを入れ替えることができます。

データを指定する4つのメソッド
  • loc
  • iloc
  • at
  • iat

大きく「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モジュール 公式ページのリンク

タイトルとURLをコピーしました