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

list、numpy、pandas の2次元配列の相互変換をまとめます。

参考サイトを載せておきます。
ndarray の公式ドキュメント
pandas.DataFrame の公式ドキュメント

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

相互変換を図にしました。

相互変換図

list型とndarray型

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を経由して変換する必要があります。

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つあります。

# 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型へ変換

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型への変換です。
一気に変換できず段階を踏む必要があります。

# 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型への変換です。
これもあまりきれいな変換とは言えないです。

# 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