pandas.DataFrameとNumPy配列(numpy.ndarray)の相互変換
> > pandas.DataFrameとNumPy配列(numpy.ndarray)の相互変換
pandas.DataFrame→NumPy配列(numpy.ndarray)へ変換
まずはpandas.DataFrameからNumPy配列への変換です。
pandasが用意してくれているto_numpy()を使用することで変換が可能です。
import pandas as pdif __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 9arr = 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 pdif __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 9arr = 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] = 10print(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 pdif __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 9arr = 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] = 10print(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 pdimport numpy as npif __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 pdimport numpy as npif __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では処理速度が違ったり、用意されている関数が違ったりするため必要に応じて相互変換していくのがいいでしょう。