list・ndarray・pandas.DataFrameの相互変換まとめ (2次元)

2次元の相互変換をまとめておく

list、numpy、pandas の2次元配列の相互変換をまとめます。
参考サイトを載せておきます。
ndarray の公式ドキュメント
pandas.DataFrame の公式ドキュメント

相互変換を図にしてみます。

相互変換図

list型とndarray型

Python

    li = [[1, 2, 3], [4, 5, 6]]
    print(li)
    print(type(li))
    # [[1, 2, 3], [4, 5, 6]]
    # <class 'list'>
        
    # list型をndarray型に変換
    nda = np.array(li)
    print(nda)
    print(type(nda))
    # [[1 2 3]
    #  [4 5 6]]
    # <class 'numpy.ndarray'>
    
    # ndarray型をlist型に変換
    li = nda.tolist()
    print(li)
    print(type(li))
    # [[1, 2, 3], [4, 5, 6]]
    # <class 'list'>

list型とpandas.DataFrame型

残念ながら、2次元の場合は、pandas.DataFrame 型から、一気に list 型へ変換できません。なので、ndarray を経由して、変換する必要があります。

Python

    li = [[1, 2, 3], [4, 5, 6]]
    print(li)
    print(type(li))
    # [[1, 2, 3], [4, 5, 6]]
    # <class 'list'>
    
    # list型をDataFrame型に変換
    df = pd.DataFrame(li)
    print(df)
    print(type(df))
    # 0  1  2
    # 0  1  2  3
    # 1  4  5  6
    # <class 'pandas.core.frame.DataFrame'>
    
    # DataFrame型を、ndarray型を経由して、list型に変換
    li = df.to_numpy().tolist()
    print(li)
    print(type(li))
    # [[1, 2, 3], [4, 5, 6]]
    # <class 'list'>

ndarray型とpandas.DataFrame型

pandas.DataFrame 型を ndarray 型にする方法は2つあります。

Python

    # 2次元のndarray型はreshapeでも作成できる。
    nda = np.array([1, 2, 3, 4, 5, 6])
    nda = nda.reshape(2, 3)
    print(nda)
    print(type(nda))
    # [[1 2 3]
    #  [4 5 6]]
    # <class 'numpy.ndarray'>
    
    # ndarray型をpd.DataFrame型に変換
    df = pd.DataFrame(nda)
    print(df)
    print(type(df))
    #    0  1  2
    # 0  1  2  3
    # 1  4  5  6
    # <class 'pandas.core.frame.DataFrame'>
    
    # pd.DataFrame型をndarray型に変換
    nda = df.to_numpy()
    print(nda)
    print(type(nda))
    # [[1 2 3]
    #  [4 5 6]]
    # <class 'numpy.ndarray'>

    # pd.DataFrame型をndarray型に変換
    nda = df.values
    print(nda)
    print(type(nda))
    # [[1 2 3]
    #  [4 5 6]]
    # <class 'numpy.ndarray'>

list型から、Index、カラム名付きのDataFrame型へ変換

Python

まずは、list 型から、カラム名付きの DataFrame 型へ変換してみます。


    # list型を、カラム名付きのDataFrame型に変換する。
    # 名前と身長が書かれたリスト
    li = [['Mike', 164], ['Ken', 173], ['Vanessa', 181]]

    # カラム名付きでDataFrame型に変換する。
    df = pd.DataFrame(li, columns=['Name', 'Height'])
    print(df)

    #    Name  Height
    # 0     Mike     164
    # 1      Ken     173
    # 2  Vanessa     181

次に、list 型から、Index と カラム名付きの DataFrame 型へ変換してみます。
一気に変換できず、段階を踏む必要があります。

Python

    # list型を、Indexとカラム名付きのDataFrame型に変換する。
    # 名前と身長と出身国が書かれたリスト
    li = [['Mike', 164, 'US'], ['Ken', 173, 'JP'], ['Vanessa', 181, 'UK']]

    # 一旦、カラム名付きのDataFrame型に変換する。
    # 名前をIndexとして、カラム名付きでDataFrame型に変換する。
    df = pd.DataFrame(li, columns=['Name', 'Height', 'Country'])
    print(df)

    #    Name  Height Country
    # 0     Mike     164      US
    # 1      Ken     173      JP
    # 2  Vanessa     181      UK

    # "Name"のカラムをIndexにして、元Indexの通し番号は削除する。
    df = df.set_index('Name', drop=True)
    print(df)

    #          Height Country
    # Name
    # Mike        164      US
    # Ken         173      JP
    # Vanessa     181      UK

もうひとつ、list 型から、Index と カラム名付きの DataFrame 型への変換方法です。
これも、あまりきれいな変換とは言えないです。

Python

    # list型を、Indexとカラム名付きのDataFrame型に変換する。
    # 名前と身長と出身国が書かれたリスト
    li = [['Mike', 164, 'US'], ['Ken', 173, 'JP'], ['Vanessa', 181, 'UK']]
    # 名前をIndexにして、他の情報をカラムに入れる。
    df_tmp = pd.DataFrame(li)
    df = pd.DataFrame(
        df_tmp.iloc[:, 1:].to_numpy(),
        columns=['Height', 'Country'],
        index=df_tmp[0])
    print(df)

    #         Height Country
    # 0
    # Mike       164      US
    # Ken        173      JP
    # Vanessa    181      UK
    
    # Index名を付ける。
    df.index.name = 'Name'
    print(df)
    
    #         Height Country
    # Name
    # Mike       164      US
    # Ken        173      JP
    # Vanessa    181      UK