ホーム > python > pandas > pandas.DataFrameとNumPy配列(numpy.ndarray)の相互変換

pandas.DataFrameとNumPy配列(numpy.ndarray)の相互変換

pythonpandas

pandas.DataFrame→NumPy配列(numpy.ndarray)へ変換

まずはpandas.DataFrameからNumPy配列への変換です。
pandasが用意してくれているto_numpy()を使用することで変換が可能です。

import pandas as pd
if __name__ == '__main__':
df = pd.DataFrame({"col0": [0, 1, 2, 3, 4], "col1": [5, 6, 7, 8, 9]})
print(df)
# 出力結果
# col0 col1
# 0 0 5
# 1 1 6
# 2 2 7
# 3 3 8
# 4 4 9
arr = df.to_numpy()
# 型の確認
print(type(arr))
# 出力結果
# <class 'numpy.ndarray'>
print(arr)
# 出力結果
# [[0 5]
# [1 6]
# [2 7]
# [3 8]
# [4 9]]

基本的にはこれだけなのですが、公式ドキュメントに記載の通りここで得られる結果はview担っている可能性があります。
つまり、下のDataFrameと同じメモリを参照しており、「arr」の値を変更すると元のDataFrameも変更されてしまいます。
一度実行してみましょう。

import pandas as pd
if __name__ == '__main__':
df = pd.DataFrame({"col0": [0, 1, 2, 3, 4], "col1": [5, 6, 7, 8, 9]})
print(df)
# 出力結果
# col0 col1
# 0 0 5
# 1 1 6
# 2 2 7
# 3 3 8
# 4 4 9
arr = df.to_numpy()
# 型の確認
print(type(arr))
# 出力結果
# <class 'numpy.ndarray'>
print(arr)
# 出力結果
# [[0 5]
# [1 6]
# [2 7]
# [3 8]
# [4 9]]
# 配列の(0,0)の要素を10に置き換える
arr[0,0] = 10
print(arr)
# NumPy配列出力結果
# [[10 5]
# [ 1 6]
# [ 2 7]
# [ 3 8]
# [ 4 9]]
print(df)
# DataFrame出力結果
# col0 col1
# 0 10 5
# 1 1 6
# 2 2 7
# 3 3 8
# 4 4 9

これを防ぐために、to_numpy()では「copy」という引数が用意されています。
copy=Trueと指定することで、上記の様な現象を確実に防ぐことが可能です。

import pandas as pd
if __name__ == '__main__':
df = pd.DataFrame({"col0": [0, 1, 2, 3, 4], "col1": [5, 6, 7, 8, 9]})
print(df)
# 出力結果
# col0 col1
# 0 0 5
# 1 1 6
# 2 2 7
# 3 3 8
# 4 4 9
arr = df.to_numpy(copy=True)
# 型の確認
print(type(arr))
# 出力結果
# <class 'numpy.ndarray'>
print(arr)
# 出力結果
# [[0 5]
# [1 6]
# [2 7]
# [3 8]
# [4 9]]
# 配列の(0,0)の要素を10に置き換える
arr[0,0] = 10
print(arr)
# NumPy配列出力結果
# [[10 5]
# [ 1 6]
# [ 2 7]
# [ 3 8]
# [ 4 9]]
print(df)
# DataFrame出力結果
# col0 col1
# 0 0 5
# 1 1 6
# 2 2 7
# 3 3 8
# 4 4 9


NumPy配列(numpy.ndarray)→pandas.DataFrameへ変換

以前【pandas】DataFrame形式のデータ生成/データ取得という記事でも記載した通り、下記の様にすることで変換が可能です。

import pandas as pd
import numpy as np
if __name__ == '__main__':
# 1次元のNumPy配列
input_ndarr_1d = np.arange(5)
df_ndarr_1d = pd.DataFrame(input_ndarr_1d)
print(df_ndarr_1d)
# 出力結果
# 0
# 0 0
# 1 1
# 2 2
# 3 3
# 4 4
# 2次元のNumPy配列
input_ndarr_2d = np.arange(10).reshape(2, 5)
df_ndarr_2d = pd.DataFrame(input_ndarr_2d)
print(df_ndarr_2d)
# 出力結果
# 0 1 2 3 4
# 0 0 1 2 3 4
# 1 5 6 7 8 9

もちろんDataFrameだけでなくpandas.Seriesにも変換可能です。

import pandas as pd
import numpy as np
if __name__ == '__main__':
# 1次元のNumPy配列
input_ndarr_1d = np.arange(5)
series = pd.Series(input_ndarr_1d)
print(type(series))
# 出力結果
# <class 'pandas.core.series.Series'>
print(series)
# 出力結果
# 0
# 0 0
# 1 1
# 2 2
# 3 3
# 4 4
# dtype: int32

NumPy配列、pandas.DataFrameでは処理速度が違ったり、用意されている関数が違ったりするため必要に応じて相互変換していくのがいいでしょう。