list, numpy, series, dataframe を相互に変換する 【完全網羅】

programming Machine Learning

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パターンあることを指摘して、すべての変換を網羅しているサイトが見つかりませんでした。配列変換の組み合わせが出てくるたびに、都度、ネット検索をするのも時間の無駄です。

ということで、すべてを網羅するようにサンプルスクリプト、関数をまとめました。
これで煩雑な配列の変換からも解放です!
とはいえ、こういった現状は何なんでしょうか。各関数/メソッドの命名程度は統一されているとよいのですけれども。。

関連リンク
・ “A column-vector y was passed when a 1d array was expected.” が出たとき 【scikit-learn】
・ リスト、タプル、辞書型のサンプルコード 【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 ) ) 

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