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