pythonのPandasモジュールを使って、配列(list)などの一般的なデータから、表を作成する方法について解説しています。
表を作成するときに列名を変更する方法や、表作成後に後から変更する方法、複数列を持った表データを作成する方法などを実例で紹介しています。
また、作成した表の列名と行名を後から変更する方法を、個別に変更するパターンと同時に変更するパターンで紹介しています。
使用するモジュール
表の作成には、pandasモジュールのDataFrameオブジェクトを使います。
Pandasは以下のように、省略名pdでインポートするのが一般的です。
import pandas as pd
DataFrameは次のように使います。
pd.DataFrame(配列)
- 「pd」:pandasの略。pdインポート
- 「DataFrame」:2次元の表データの作成
表を作成する方法
表を作成するために、表組にしたいデータを配列で用意します。
listA = ['AAA', 'BBB', 'CCC', 'DDD']
次のように、pd.Dataframeの引数に配列を渡せば、表として読み込まれます。
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
df1 = pd.DataFrame(listA)
df1
#出力
0
0 AAA
1 BBB
2 CCC
3 DDD
・1列目は見出し(0からのインデックス番号)
・1行目は列名(0からのインデックス番号)
データを引数に直接入力しても作成できます。
import pandas as pd
pd.DataFrame(['AAA', 'BBB', 'CCC', 'DDD'])
#出力
0
0 AAA
1 BBB
2 CCC
3 DDD
複数列の表を作成する方法
複数列をもった表を作成するには、方法が2つあります。
- DataFrameで表を作成後に配列(list)を追加する。
- DataFrameで2次元配列を表に変換する。
- DataFrameのデータを結合する。
DataFrameで表を作成後に配列(list)を追加する方法
DataFrameで表を作成後に配列(list)を追加するには、表組データに対して、列名と要素を指定して追加します。
df['aaa'] = ['AAA', 'BBB',,,]
- df:表組データ
- aaa:列名(数値でも可)
- [‘AAA’, ‘BBB’,,,]:追加する配列
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
df1= pd.DataFrame(listA)
df1[1] = ['EEE', 'FFF', 'GGG', 'HHH']
df1
#出力
0 1
0 AAA EEE
1 BBB FFF
2 CCC GGG
3 DDD HHH
エラー事例
表組データの行数と、追加するlistの要素の数が異なる場合はエラーになります。
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
df1= pd.DataFrame(listA)
df1[1] = ['EEE', 'FFF', 'GGG']
df1
#出力
# ValueError: Length of values does not match length of index
DataFrameで2次元配列を表に変換する方法
複数列を持った表を作るには、2次元配列をDataFrameで表に変換することでも対応できます。
2次元配列は以下のような形になります。
lists = [ ['AAA', 'BBB', 'CCC', 'DDD'] , ['EEE', 'FFF', 'GGG', 'HHH'] ]
#または
listA = ['AAA', 'BBB', 'CCC', 'DDD']
listB = ['EEE', 'FFF', 'GGG', 'HHH']
lists = [listA, listB]
これをDataFrameで変換します。
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
listB = ['EEE', 'FFF', 'GGG', 'HHH']
lists = [listA, listB]
df = pd.DataFrame(lists)
print( df )
#出力
0 1 2 3
0 AAA BBB CCC DDD
1 EEE FFF GGG HHH
DataFrameのデータを結合する方法
DataFrameのデータに、DataFrameのデータを結合することもできます。
df['aaa'] = dfB
- df:元の表
- aaa:追加する列名(数値でも可)
- dfB:DataFrameのデータを格納した変数(変数名は任意)
こちらも、元の表の要素数と追加するlistの要素数が異なる場合はエラーになります。
import pandas as pd
#表dfAを作成
listA = ['AAA', 'BBB', 'CCC', 'DDD']
dfA= pd.DataFrame(listA)
#表dfBを作成
listB =['EEE', 'FFF', 'GGG', 'HHH']
dfB= pd.DataFrame(listB)
#表dfAに表dfBを結合
dfA['1'] = dfB
dfA
#出力
0 1
0 AAA EEE
1 BBB FFF
2 CCC GGG
3 DDD HHH
例:4列の表を作成
次のlistA~Dの4つの配列から、4列の表を作成する場合は以下のようになります。
一つ一つ足し合わせる場合
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
listB = ['EEE', 'FFF', 'GGG', 'HHH']
listC = ['III', 'JJJ', 'KKK', 'LLL']
listD = ['MMM', 'NNN', 'OOO', 'PPP']
dfA = pd.DataFrame(listA)
dfA[1] = listB
dfA[2] = listC
dfA[3] = listD
dfA
#出力
0 1 2 3
0 AAA EEE III MMM
1 BBB FFF JJJ NNN
2 CCC GGG KKK OOO
3 DDD HHH LLL PPP
2次元配列にしてから表に変換する場合
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)
print( df )
列内の要素に文字列を追加する(+演算子)
+演算子でDataFrameの表を足し合わせると、各列の要素が結合されます。
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
dfA= pd.DataFrame(listA)
listB =['EEE', 'FFF', 'GGG', 'HHH']
dfB= pd.DataFrame(listB)
dfA + dfB
#出力
0
0 AAAEEE
1 BBBFFF
2 CCCGGG
3 DDDHHH
列の名前を変更する方法
列名を変更するには主に以下の方法があります。
表作成時に指定する方法
DataFrameのオプションで columns=[‘列の名前’] を指定します。
columns=['列の名前1', '列の名前2',,,]
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
df2 = pd.DataFrame(listA, columns=['列名1'])
df2
print(df2)
#出力
列名1
0 AAA
1 BBB
2 CCC
3 DDD
列が複数ある場合
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, columns=['列名1', '列名2', '列名3', '列名4'])
print( df )
#出力
列名1 列名2 列名3 列名4
0 AAA BBB CCC DDD
1 EEE FFF GGG HHH
2 III JJJ KKK LLL
3 MMM NNN OOO PPP
既存の表データの列名を変更する方法
既存の表データの列名を変更するには、columnsメソッドとrenameメソッドを使う方法があります。
columnsメソッドは列名をまとめて変更する場合につかいます。renameメソッドは特定の列を指定して変更することができます。
また、columnsメソッドは元の表のデータが変わる破壊的処理です。renameメソッドは元の表のデータは変化せず、新たに変更した表を作成する非破壊処理です。
columnsメソッド
df.columns=['列の名前1', '列の名前2',,,]
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=['列名1', '列名2', '列名3', '列名4']
print( df )
#出力
列名1 列名2 列名3 列名4
0 AAA BBB CCC DDD
1 EEE FFF GGG HHH
2 III JJJ KKK LLL
3 MMM NNN OOO PPP
renameメソッド
renameメソッドは非破壊で列名を変更できるメソッドです。元の表をコピーして、コピーした表のデータを変更するので、元の表はそのまま残ります。
df1 = df.rename(columns={'元の列名':'列名'})
- df1 : 列名変更後の表データを格納する変数名(名前は任意)
- df:表データ
- .rename:dfオブジェクトに対してrenameメソッドを実行
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=['列名1', '列名2', '列名3', '列名4']
#列名2をcolumn2に変更し、別の変数df1に格納
df1 = df.rename(columns={'列名2':'column2'})
print( df1 )
#出力
列名1 column2 列名3 列名4
0 AAA BBB CCC DDD
1 EEE FFF GGG HHH
2 III JJJ KKK LLL
3 MMM NNN OOO PPP
行の名前を変更する方法
列名を変更するには主に以下の方法があります。
表作成時に指定する方法
DataFrameのオプションで index=[ ‘行名1’, ‘行名2’,,,,]を指定します。
行名の指定は文字列、数値どちらも可能です。変数で指定することもできます。
文字列で指定列名の変更
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
df1 = pd.DataFrame(listA, index=['111','222','333','444'])
df1
#出力
0
111 AAA
222 BBB
333 CCC
444 DDD
数値で指定列名の変更
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
df1 = pd.DataFrame(listA, index=[111,22.2,3.33,444])
df1
#出力
0
111.00 AAA
22.20 BBB
3.33 CCC
444.00 DDD
変数で指定列名の変更
import pandas as pd
listA = ['AAA', 'BBB', 'CCC', 'DDD']
indexA = ['111','222','333','444']
df1 = pd.DataFrame(listA, index=indexA)
df1
#出力
0
111 AAA
222 BBB
333 CCC
444 DDD
既存の表データの列名を変更する方法
既存の表データの列名を変更するには、indexメソッドとrenameメソッドを使う方法があります。
indexメソッドは行名をまとめて変更する場合に使います。renameメソッドは特定の行を指定して変更することができます。
また、indexメソッドは元の表のデータが変わる破壊的処理です。renameメソッドは元の表のデータは変化せず、新たに変更した表を作成する非破壊処理です。
indexメソッド
df.index=['列の名前1', '列の名前2',,,]
※行数とindexで指定した要素数が一致している必要があります。多かったり、少ないとエラーになります。
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.index=['行名1', '行名2', '行名3', '行名4']
print( df )
#出力
0 1 2 3
行名1 AAA BBB CCC DDD
行名2 EEE FFF GGG HHH
行名3 III JJJ KKK LLL
行名4 MMM NNN OOO PPP
renameメソッド
renameメソッドは非破壊で列名を変更できるメソッドです。元の表をコピーして、コピーした表のデータを変更するので、元の表はそのまま残ります。
df1 = df.rename(index={'元の行の名前':'変更後の行の名前'})
- df1 : 行名変更後の表データを格納する変数名(名前は任意)
- df:元の表データ
- .rename:dfオブジェクトに対してrenameメソッドを実行
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.index=['行名1', '行名2', '行名3', '行名4']
#行名2をindex2に変更し、別の変数df1に格納
df1 = df.rename( index={'行名2':'index2'} )
print( df1 )
#出力
0 1 2 3
行名1 AAA BBB CCC DDD
index2 EEE FFF GGG HHH
行名3 III JJJ KKK LLL
行名4 MMM NNN OOO PPP
行名と列名を同時に変更する方法
行名と列名を同時に変更するには以下の方法があります。
表作成時に指定する方法
表作成時に行名と列名を変更するには、DataFrameのオプションでcolumnsとindexを同時に指定します。
pd.DataFrame(配列, columns=['列名1','列名2',,,,], index=['行名1','行名2',,,,])
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, columns=[ '列名1', '列名2', '列名3', '列名4' ], index=[ '行名1', '行名2', '行名3', '行名4' ])
print( df )
#出力
列名1 列名2 列名3 列名4
行名1 AAA BBB CCC DDD
行名2 EEE FFF GGG HHH
行名3 III JJJ KKK LLL
行名4 MMM NNN OOO PPP
既存の表データの列名を変更する
既存の表データの列名を変更する方法にはindexメソッドとcolumnsメソッドを使う方法と、renameメソッドを使う方法があります。
columnsメソッドとindexメソッドは行列名をまとめて変更する場合につかいます。renameメソッドは特定の行列を指定して変更することができます。
また、columnsメソッドとindexメソッドは元の表のデータが変わる破壊的処理です。renameメソッドは元の表のデータは変化せず、新たに変更した表を作成する非破壊処理です。
columnsメソッドとindexメソッド
df.columns=[ '列名1', '列名2', '列名3', '列名4' ]
df.index=[ '行名1', '行名2', '行名3', '行名4' ]
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=[ '列名1', '列名2', '列名3', '列名4' ]
df.index=[ '行名1', '行名2', '行名3', '行名4' ]
print( df )
#出力
列名1 列名2 列名3 列名4
行名1 AAA BBB CCC DDD
行名2 EEE FFF GGG HHH
行名3 III JJJ KKK LLL
行名4 MMM NNN OOO PPP
renameメソッド
renameメソッドは非破壊で列名を変更できるメソッドです。元の表をコピーして、コピーした表のデータを変更するので、元の表はそのまま残ります。
df1 = df.rename(columns={'元の列名':'変更後の列名'}, index={'元の行名':'変更後の行名'})
- df1 : 行列名変更後の表データを格納する変数名(名前は任意)
- df:表データ
- .rename:dfオブジェクトに対してrenameメソッドを実行
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, columns=[ '列名1', '列名2', '列名3', '列名4' ], index=[ '行名1', '行名2', '行名3', '行名4' ])
#特定の行列名を変更
df1 = df.rename( columns={'列名2':'column2'}, index={'行名1':'index1', '行名3':'index3'} )
print( df1 )
#出力
列名1 column2 列名3 列名4
index1 AAA BBB CCC DDD
行名2 EEE FFF GGG HHH
index3 III JJJ KKK LLL
行名4 MMM NNN OOO PPP