PandasのDataFrameを使って、一つの表を作成する場合に、複数の方法があります。
表(テーブル)の元となるデータを用意して、行名や列名をつけて、表(テーブル)データを作成する手順を実例を用いてわかりやすくまとめています。
なお、ベースとなる表はcsvファイルで作って読み込むのが一番早いです(私感)
はじめに(作成する表)
例として以下のような表を作成します。
- 列名:row0~row5
- 行名:col0~col4
- col0:1~6
- col1:col0*100
- col2:col0/3
- col3:AAA~FFF
- col4:col3 & col1
2次元listから作成する方法
■2次元配列とは?
[[‘A’,’B’,,],[‘C’,’D’,,],,,]
1次元のリスト[‘A’,’B’,,]が同一の[ ]内に複数並列で入ったもの。
下記3パターンで確認する。
(1)行列名を後から指定
(2)表作成時にオプションで指定
(3)表から行名となる列を指定
行列名を後から指定する
▼手順
①各行を一つのlistにする
②表に変換
③行名の変更
④列名の変更
①各行を一つのlistとして並列に並べる2次元配列
list = [
[1, 100, 0.33, 'AAA', 'AAA100'],
[2, 200, 0.67, 'BBB', 'BBB200'],
[3, 300, 1, 'CCC', 'CCC300'],
[4, 400, 1.33, 'DDD', 'DDD400'],
[5, 500, 1.67, 'EEE', 'EEE500'],
[6, 600, 2, 'FFF', 'FFF600']
]
②表に変換
pd.DataFrame(list)
└pandasのDataFrameで表に変換。
df = pd.DataFrame(list)
df
行と列の名前は自動で割り振られた番号になる。
③行名の変更
df.index = [‘A’,’B’,,,]
・行名(index)を指定した名称に変更する。
・[ ]内の要素の数と行の数を一致させる。しないとエラー。
df.index = ['row0','row1','row2','row3','row4','row5']
df
④列名の変更
df.columns = [‘a’,’b’,,,]
・列名(column)を指定した名称に変更する。
・[ ]内の要素の数と行の数を一致させる。しないとエラー。
df.columns = ['col0','col1','col2','col3','col4']
df
以上で完成。
表作成時に行列名をオプションで指定する
▼手順
①各行を一つのlistにする
②表に変換(オプションで行列名を指定)
2-1 columnsオプション
2-2 indexオプション
①各行を一つのlistとして並列に並べる
list = [
[1, 100, 0.33, 'AAA', 'AAA100'],
[2, 200, 0.67, 'BBB', 'BBB200'],
[3, 300, 1, 'CCC', 'CCC300'],
[4, 400, 1.33, 'DDD', 'DDD400'],
[5, 500, 1.67, 'EEE', 'EEE500'],
[6, 600, 2, 'FFF', 'FFF600']
]
②表に変換(オプションで行列名を指定)
pd.DataFrame(list, index=[‘A’,’B’,,,], columns=[‘a’,’b’,,,])
└「list」:表にする配列
└ index=[‘A’,’B’,,,]:indexオプション
└ columns=[‘a’,’b’,,,]:columnsオプション
└オプションの[ ]の中は変数で指定可。
ind = ['row0','row1','row2','row3','row4','row5']
col = ['col0','col1','col2','col3','col4']
df = pd.DataFrame(list, index=ind, columns=col)
df
以上で完成。
表から行名となる列を指定
▼手順
①各行を一つのlistにする
②表に変換
③列名を変更
④行名となる列を指定
①各行を一つのlistにする
行名を2次元配列の中に含める。
list = [
['row0', 1, 100, 0.33, 'AAA', 'AAA100'],
['row1', 2, 200, 0.67, 'BBB', 'BBB200'],
['row2', 3, 300, 1, 'CCC', 'CCC300'],
['row3', 4, 400, 1.33, 'DDD', 'DDD400'],
['row4', 5, 500, 1.67, 'EEE', 'EEE500'],
['row5', 6, 600, 2, 'FFF', 'FFF600']
]
②表に変換
pd.DataFrame(list)
└ 「list」:配列データの入った変数表に変換
df = pd.DataFrame(list)
df
行と列の名前は自動で割り振られた番号になる。
③列名を変更
df.columns = [‘a’,’b’,,,]
・列名(column)を指定した名称に変更する。
・[ ]内の要素の数と行の数を一致させる。しないとエラー。
※次の列名となる行の指定(set_index)でマルチインデックスになるのを防ぐため、行名となる列名は空欄「”」にする。
df.columns = ['','col0','col1','col2','col3','col4']
df
④行名となる列を指定
set_index(‘列名’)
行名となる列を指定。一番左端の列には名前がついていないので列名は「”」を指定する。
df = df.set_index('')
df
一番左端の列名「”」が見出しとして設定された。
1次元listから作成
下記3パターンで確認する。
(1)各listをまとめて結合
(2)各listを一つづつ結合
(3)数式で結合
各listをまとめて結合
▼手順
①各行ごとのlistを作成
②まとめて表に変換
③行名の変更
④列名の変更
①各行ごとのlistを作成
listA = [1, 100, 0.33, 'AAA', 'AAA100']
listB = [2, 200, 0.67, 'BBB', 'BBB200']
listC = [3, 300, 1, 'CCC', 'CCC300']
listD = [4, 400, 1.33, 'DDD', 'DDD400']
listE = [5, 500, 1.67, 'EEE', 'EEE500']
listF = [6, 600, 2, 'FFF', 'FFF600']
②まとめて表に変換
pd.DataFrame([A,B,,,])
└ 「A」「B」1次元のlist
└ 要素の数は等しい
pd.DataFrame( [listA, listB, listC, listD, listE, listF] )
③行名の変更
df.index = [‘A’,’B’,,,]
・行名(index)を指定した名称に変更する。
・[ ]内の要素の数と行の数を一致させる。しないとエラー。
df.index = ['row0','row1','row2','row3','row4','row5']
df
④列名を変更
df.columns = [‘a’,’b’,,,]
・列名(column)を指定した名称に変更する。
・[ ]内の要素の数と行の数を一致させる。しないとエラー。
df.columns = ['','col0','col1','col2','col3','col4']
df
以上で完成。
各listを一つづつ結合
▼手順
①各行ごとのlistを作成
②表の作成
③表に列を追加
④行名の変更
⑤転置
①各行ごとのlistを作成listを作成
listA = [1, 100, 0.33, 'AAA', 'AAA100']
listB = [2, 200, 0.67, 'BBB', 'BBB200']
listC = [3, 300, 1, 'CCC', 'CCC300']
listD = [4, 400, 1.33, 'DDD', 'DDD400']
listE = [5, 500, 1.67, 'EEE', 'EEE500']
listF = [6, 600, 2, 'FFF', 'FFF600']
②表の作成
1つのlistから表を生成する。
pd.DataFrame(list, columns=[‘A’])
└ 「listA」:配列データ
└ 「columns=[‘A’]」:列名をAにする表の作成
df= pd.DataFrame(listA, columns=['row0'])
df
※1列の読込の場合、行列が転置した状態になる。
▼補足:列名をつけて表を作成する方法
表作成時に列名を指定する別の方法。
pd.DataFrame({‘A’:[1,2,,],’B’:[3,4,,],})
└({ })の中に‘列名’:[配列]を記載
pd.DataFrame({'row0':[1, 100, 0.33, 'AAA', 'AAA100']})
列名をつけて作成(複数列)
pd.DataFrame({'row0':[1, 100, 0.33, 'AAA', 'AAA100'], 'row1':[2, 200, 0.67, 'BBB', 'BBB200']})
③表に列を追加
df[‘B’] = pd.DataFrame(list)
└ 「B」:追加する列名
└ 「list」:追加する表データ
df['row1'] = pd.DataFrame(listB)
df['row2'] = pd.DataFrame(listC)
df['row3'] = pd.DataFrame(listD)
df['row4'] = pd.DataFrame(listE)
df['row5'] = pd.DataFrame(listF)
df
④行名の変更
df.index = [‘A’,’B’,,,]
df.index = ['col0','col1','col2','col3','col4']
df
⑤転置
df.T
└行列を入れ替える。
df = df.T
df
以上で完成。
数式で結合
各列に規則性がある場合、数式を用いて列を結合できる。
▼規則性
- col1:col0*100
- col2:col0/3
- col4:col3 & col1
▼手順
①listを作成
②表を作成
③数式を使って表に列を追加
④行名の変更
①listを作成
ベースとなる列を作成する。
col0とcol3の用の2つ分。
listA = [1,2,3,4,5,6]
listD = ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF']
②表の作成
pd.DataFrame(list, columns=[‘A’])
└ 「listA」:配列データ
└ 「columns=[‘A’]」:列名をAにする表の作成
df = pd.DataFrame(listA, columns=['col0'])
df
③数式を使って表に列を追加
・df[‘B’] = df[‘A’]/2
└ 「B」:追加する列名
└ 「df[‘A’]」/2:既存の列名Aを2で割った値を代入
・df[‘C’] = df[‘A’] + df[‘B’]
└ 列「A」と「B」の値を結合する
└ ※str + intはエラー(型を合わせる)
・df[‘A’].astype(str)
└ 列「A」を「str」型に変更する数式を使って表に列を追加
df['col1'] = df['col0'] * 100
df['col2'] = df['col0'] / 3
df['col3'] = pd.DataFrame(listD)
df['col4'] = df['col3'] + df['col1'].astype(str)
df
④行名の変更
df.index = [‘A’,’B’,,,]
df.index=['row0','row1','row2','row3','row4','row5']
df
以上で完成。
csvファイルで作成し読込み
▼手順
①csvファイルで表を作成
②read_csvメソッドでインポート
└ 見出し列の指定
①csvファイルで表を作成
下記のような表を作成する。
②read_csvメソッドでインポート
read_csv(‘ファルパス’, index_col=n)
└ 「’ファイルパス’」:絶対パスでも相対パスでもOK
└ 「index_col=n」:見出しとなる列番号(n:整数)を指定
▼desktopのtest.csvファイルを読み込む場合
import pandas as pd
pd.read_csv('~/desktop/test.csv', index_col=0)
以上で完成。
CSVファイル読み込み時は、行名や列名となる行列を指定したり、読み込む範囲を指定することも可能。詳細は以下ページをご参考。
使用したメソッド等一覧
・pd.DataFrame(list)
└ listを表に変換
・pd.DataFrame([A,B,,,])
└ 一次元listをまとめて表に変換
・df.index = ['A','B',,,]
└ 行名の変更
・df.columns = ['a','b',,,]
└ 列名の変更
・pd.DataFrame(list, index=['A','B',,,])
└ 表作成時に行名を指定
・pd.DataFrame(list, columns=['a','b',,,])
└ 表作成時に列名を指定
・pd.DataFrame({'A':[1,2,,],'B':[3,4,,],})
└表作成時に列名を指定
└({ })の中に'列名':[配列]
を記載
・set_index('a')
└ 行名となる列を指定
・df['b'] = pd.DataFrame(list)
└ 表(df)に列(列名b)を追加
・df.T
└ 転置
・df['B'] = df['A']/2
└ 「B」:追加する列名
└ 「df[‘A’]」/2:既存の列名Aを2で割った値を代入
・df['C'] = df['A'] + df['B']
└ 列「A」と「B」の値を結合する
└ ※str + intはエラー(型を合わせる)
・df['A'].astype(str)
└ 列「A」を「str」型に変更する
・[['A','B',,],['C','D',,],,,]
└ 2次元配列