list、numpy、pandas の series、dataframe の各配列を相互に変換する Python のサンプルコードをまとめておきます。
list numpy 変換、list pandas 変換(list series 変換、list dataframe 変換)、series dataframe 変換など、すべての組み合わせを網羅するよう意図しています。
以下の環境で動作確認をしています。
環境: Windows 10、Python 3.x(anaconda、numpy、Pandas 設定済み)
背景 ~ 配列が4種類ある!
Python でよく使われる配列には以下の4つがあります。
配列 | 説明 |
リスト list | Python 標準の配列 |
NumPy配列 | import numpy として使用する numpy で定義された配列 |
Series | import pandas として使用する、Pandas で定義された一次元配列 |
DataFrame | import pandas として使用する、Pandas で定義された二次元配列 |
Python の機械学習などで配列を扱っていると、numpy や Pandas などの各パッケージ毎に配列が定義されています。実際に使う場面となると、相互に配列を変換する必要が生じます。
末尾のサンプルコードで説明をしていますが、配列の種類が4つあって、それぞれの配列を変換する組み合わせは12通りあります。
まずは、リストと Pandas の series の変換など、よく使われる6パターンの変換を書き出しておきます。
12通りのすべての変換は、この6通りの変換の組み合わせで可能となりますが、すべての組み合わせを書き出していると煩雑です。そこで、後半ですべての組み合わせを関数にして、サンプルコードでまとめています。
スクリプトの内容を追うのが煩雑でしたら、まずは、末尾のサンプルコードをすべてコピーして動くことを確認し、必要な関数のみを流用すれば動くと思います。
よく使う配列変換のまとめ
よく使う変換についてまとめておきます。
list numpy 変換: リストをNumPy配列に変換する
まずは、list numpy 変換のスクリプトです。Python 標準のリスト list0 を numpy 配列に変換します。
import numpy as np1
np0 = np1.array( list0 )
numpy list 変換: NumPy配列をリストに変換する
つぎは、上記の逆で、numpy list 変換のスクリプトです。numpy 配列 np0 を Python 標準のリスト list0 に変換します。
list0 = np0.tolist()
list pandas (series) 変換: リストを pandas のシリーズに変換する
続いて、list pandas 変換です。Python 標準のリスト list0 を pandas の series に変換します。
import pandas as pd1
series0 = pd1.Series( list0 )
pandas (series) list 変換: pandas のシリーズをリストに変換する
上記の逆、pandas list 変換です。pandas の series を list に変換します。
list0 = series0.values.tolist()
series dataframe 変換: Pandas のシリーズをデータフレームに変換する
つぎは、series dataframe 変換です。pandas の series を dataframe に変換します。
import pandas as pd1
dataframe0 = pd1.DataFrame( series0 )
dataframe series 変換: Pandas のデータフレームをシリーズに変換する
上記の逆で、dataframe series 変換です。pandas の dataframe を series に変換します。
col0 = 0
series0 = dataframe0.iloc[:, col0]
なお、ここで、DataFrame は2次元配列です。2次元配列である DataFrame を 1次元配列である series に直すには、抽出する列を指定する必要があるため、col0 = 0 として、抽出する例を指定しています。もし、最初の列(col0 = 0)以降の列を指定する場合は、col0 の値を指定してください。
その他の組み合わせ: 完全に網羅する方法
上記の6つのパターンで、list ⇔ series、list ⇔ NumPy配列、series ⇔ DataFrame については変換ができます。
これ以外の組み合わせ、例えば、list ⇔ DataFrame の変換については、上記のコードを組み合わせることで実現できます。
全部で12パターンあり、すべての組み合わせを書き出していくと煩雑です。そこで詳細な説明は省略し、すべてのパターンを関数にした例を末尾のサンプルコードにまとめました。
必要な部分をコピーして活用できるよう意図しています。
まとめ
Python のリスト、NumPy配列、Pandas の Series、DataFrame の4種類の配列を相互に変換する事例をまとめました。
ネット検索をすると、各配列の部分的な説明は出てきます。
ところが、4つの配列間の変換が12パターンあることを指摘して、すべての変換を網羅しているサイトが見つかりませんでした。配列変換の組み合わせが出てくるたびに、都度、ネット検索をするのも時間の無駄です。
ということで、すべてを網羅するようにサンプルスクリプト、関数をまとめました。
これで煩雑な配列の変換からも解放です!
とはいえ、こういった現状は何なんでしょうか。各関数/メソッドの命名程度は統一されているとよいのですけれども。。
関連リンク
・ リスト、タプル、辞書型のサンプルコード 【Python】
備考:12パターンの配列変換をすべて関数化する
配列変換を毎回ネット検索するのも時間の無駄です。そこで参考として、関数の命名ルールを統一し、すべて関数化します。
使い方
① 下記のスクリプトをテキストファイルに貼りつけて、array1.py 等の名前で保存してください。
② コンソール等の環境から、①の python スクリプトを実行してください。
③ すべての組み合わせの関数を定義しています。
list2np() (list から numpy 配列に変換する)、list2df() (list から DataFrame に変換する)といった要領で関数を呼び出せば、すべての組み合わせで相互に変換できるようにしています。
必要な部分のみコピーして活用してください。
末尾のサンプルコードの説明
・ まず、numpy と pandas をインポートしています。
・ つぎに、各配列を変換する関数 def を定義します。(12個)
配列が4つあり、サンプルコード中のコメントで図を描いています。
配列を変換する組み合わせは、同図の四角形の4辺+対角2本=6本あって、往復を考慮すると、6×2=12通りの変換(!)があります。そこで、サンプルコードでは12個の関数を定義しています。
・ 関数の命名は、変換前後の配列名の間に2 (to) を入れるというルールにしています。def の関数部分をコピーして使いまわせば、忘れても思い出せるように命名しています。
表にまとめると以下となります。
関数 | 説明 |
list2np( list0 ) | Python 標準のリスト list0 を引数に渡すと numpy の配列に変換する |
np2list( np0 ) | numpy の配列 np0 を引数に渡すと Python のリストに変換する |
list2series( list0 ) | Python 標準のリスト list0 を引数に渡すと Pandas のシリーズ(series)に変換する |
series2list( series0 ) | Pandas のシリーズ(series) series0 を引数に渡すと Python 標準のリストに変換する |
series2df( series0 ) | Pandas のシリーズ(series) series0 を引数に渡すと Pandas のデータフレーム(DataFrame)に変換する |
df2series( dataframe0, col0 ) | Pandas のデータフレーム(DataFrame) dataframe0 と dataframe の列番号 col0 を引数に渡すと Pandas のシリーズ(series) に変換する |
np2series( np0 ) | numpy の配列 np0 を引数に渡すと Pandas のシリーズ(series)に変換する |
series2np( series0 ) | Pandas のシリーズ(series) series0 を引数に渡すと numpy の配列に変換する |
df2list( dataframe0, col0 ) | Pandas のデータフレーム(DataFrame) dataframe0 と dataframe の列番号 col0 を引数に渡すと Python 標準のリストに変換する |
list2df( list0 ) | Python 標準のリスト list0 を引数に渡すと Pandas のデータフレーム(DataFrame)に変換する |
df2np( dataframe0, col0 ) | Pandas のデータフレーム(DataFrame) dataframe0 と dataframe の列番号 col0 を引数に渡すと numpy の配列に変換する |
np2df( np0 ) | numpy の配列 np0 を引数に渡すと Pandas のデータフレーム(DataFrame) に変換する |
・ サンプルコードの後半は、すべての関数を呼び出す例としています。
まず、Python 標準の list からスタートし、図の反時計回りに変換していき、続いて、時計回りに変換していきます。
それぞれの変換結果は Print() 関数で出力します。対角についても、往復で変換し、結果を出力しています。
・ なお、Pandas の DataFrame は二次元配列です。二次元配列(DataFrame)から一次元配列に直す場合は、列を1つ指定する必要があるので、列番号を引数として定義しています。往復して変換すると戻るようにするため、列番号は 0 番を指定しています。任意の二次元配列について実際に使う場合は、抜き出したい列に応じて、列番号(0)を変えてください。
サンプルコード: list ⇔ numpy ⇔ Pandas DataFrame ⇔ Series 相互変換
import numpy as np1
import pandas as pd1
def list2np( list0 ): # list -> numpy array
return np1.array( list0 )
def np2list( np0 ): # numpy array -> list
return np0.tolist()
def list2series( list0 ): # list -> series
return pd1.Series( list0 )
def series2list( series0 ): # series -> list
return series0.values.tolist()
def series2df( series0 ): # series -> data frame
return pd1.DataFrame( series0 )
def df2series( dataframe0, col0 ): # dataframe -> series
return dataframe0.iloc[:, col0]
def np2series( np0 ): # numpy array -> series
return pd1.Series( np0 )
def series2np( series0 ): # series -> numpy array
return series0.values
def df2list( dataframe0, col0 ): # dataframe -> series
return series2list( df2series( dataframe0, col0 ) )
def list2df( list0 ): # series -> data frame
return series2df( list2series( list0 ) )
def df2np( dataframe0, col0 ): # data frame -> numpy array
return series2np( df2series( dataframe0, col0) )
def np2df( np0 ): # numpy array -> data frame
return series2df( np2series( np0 ) )
# numpy array ------- list
# | |
# | |
# df ------------ series
# start
list1 = [1, 2, 3, 4]
print( "" )
print( list1 )
print( type( list1 ) )
# counterclockwise
nparray1 = list2np( list1 )
print( "" )
print( nparray1 )
print( type( nparray1 ) )
df1 = np2df( nparray1 )
print( "" )
print( df1 )
print( type( df1 ) )
series1 = df2series( df1, 0 ) # col 0 only
print( "" )
print( series1 )
print( type( series1 ) )
list1 = series2list( series1 )
print( "" )
print( list1 )
print( type( list1 ) )
# clockwise
series1 = list2series( list1 )
print( "" )
print( series1 )
print( type( series1 ) )
df1 = series2df( series1 )
print( "" )
print( df1 )
print( type( df1 ) )
nparray1 = df2np( df1, 0 ) # col 0 only
print( "" )
print( nparray1 )
print( type( nparray1 ) )
list1 = np2list( nparray1 )
print( "" )
print( list1 )
print( type( list1 ) )
# diagonal
df1 = list2df( list1 )
print( "" )
print( df1 )
print( type( df1 ) )
list1 = df2list( df1, 0 ) # col 0 only
print( "" )
print( list1 )
print( type( list1 ) )
series1 = np2series( nparray1 )
print( "" )
print( series1 )
print( type( series1 ) )
nparray1 = series2np( series1 )
print( "" )
print( nparray1 )
print( type( nparray1 ) )