31_Pandas.DataFrame,Series,NumPy配列ndarray相互変換
31_Pandas.DataFrame,Series,NumPy配列ndarray相互変換
pandas.DataFrame,pandas.SeriesとNumPyはnumpyを配列する.ndarray相互关系可以转换. DataFrameシリーズの値属性を持つndarray を取得する. NumPy配列ndarrayからDataFrame を生成する.メモリ共有に関する注意事項(表示とコピー) Pandas0.24.0以降:to_numpy()
各例はサンプルコードで説明されます.
またpandas.DataFrameとpandas.Seriesはas_とも呼ばれるmatrix()のメソッドでnumpyを返す.ndarrayは、バージョン0.23.0以降は廃止されています(使用には賛成しません).
Pandasを取得DataFrame,Series属性値のNumPy配列ndarray
pandas.DataFrameとpandas.Seriesは、値属性を持つNumPy配列numpyを取得することができる.ndarray.pandas 0.24.0から、末尾に導入されたto_を使用することを推奨します.numpy()メソッド.
pandas.DataFrame.
pandas.Series.
取得可能なndarrayのデータ型dtypeと元のpandas.DataFrameとpandas.Seriesのdtypeは同じです.
Pandas.DataFrameは数字と文字列の組み合わせで、オブジェクトタイプndarrayです.
DataFrameの特定のカラムのみをndarrayに変換する場合は、そのカラムを抽出するDataFrameの値を取得できます.カラム抽出については、次の文書を参照してください. 28_Pandasはindexにより行と列 を選択して取得する.
カラム数が1つしか選択されていない場合、ndarrayのタイプはobjectではなくそのタイプになります.
場合によっては、使用する.Tはもっと簡単かもしれません.
特定のタイプのカラムのみを抽出する条件を指定することもできます.たとえば、int 64タイプのカラムのみを抽出したい場合は、以下のように記述できます.
selectの使用についてdtypes()データ型dtypeでカラムを抽出する方法については、次の文書を参照してください. 29_pandas.DataFrameでは、特定のタイプのdtypeの列を抽出(選択)します.また、条件を満たす行名/列名の行/列のみを抽出(選択)することもできます.下記の記事を参照してください. 30_Pandas.DataFrame抽出(選択)行名および列名を指定する行および列 元のpandas.DataFrameと変換後のnumpy.ndarrayはメモリを共有し、値を変更すると別の値が変更される場合があります.以下を参照.
NumPy配列ndarrayからpandasを生成する.DataFrame,Series
いいですよDataFrameとpandas.Seriesのコンストラクション関数の最初のパラメータデータにNumPy配列numpyを指定する.ndarray.後述するようにnumpy.ndarrayと生成されたpandas.DataFrameとpandas.Series共有メモリ.
生成pandas.Series
コンストラクション関数に他のパラメータが指定されていない場合は、元のndarrayタイプのSeriesになります.
インデックス名index、シリーズ名、データ型dtypeなどをパラメータとして指定することもできます.
Seriesコンストラクション関数でデータに多次元ndarrayを指定するとエラーが発生します.
例えば、2 Dndarrayの行と列を選択してpandasに変換することができる.Series.
生成pandas.DataFrame
Seriesと同様に、コンストラクション関数に他のパラメータが指定されていない場合は、元のndarrayタイプのDataFrameになります.
パラメータを使用して、行名インデックス、列名列、データ型dtypeなどを指定することもできます.
メモリ共有に関する注意事項(表示とコピー)
値属性またはコンストラクション関数によって相互に変換するPandas.DataFrameまたはpandas.Seriesとnumpy.ndarrayは互いにメモリを共有する可能性があります.共有メモリ(1つが別のビュー)の場合、1つの値を変更すると別の値が変更されます.それらを別々に処理して使用する場合は、必ず注意してください.
次のサンプルコードおよびその結果は、パンダ0.25.1から得られる.動作はバージョンによって異なる場合があります.
valuesプロパティ
まず、以下の場合.
値はビューを返し、値を変更すると別の値が変更されます.np.shares_memory()OK.
常にビューを返すわけではありません.たとえば、各カラムに異なるデータ型dtaepがある場合は、コピーを返します.
また、行や列などの範囲を指定して値を取得する場合、ビューやコピーは指定方法によって異なる場合があります.
ビューに問題がある場合は、値のcopy()を使用してコピーを明示的に作成できます.
pandas.DataFrame,pandas.Seriesの構造方法
numpy.ndarrayはコンストラクション関数pandasに渡す.DataFrame()とpandas.Series()の場合、メモリを共有します.1つの値を変更すると、別の値も変更されます.
メモリを共有したくない場合はnumpyを使用します.ndarrayのcopy()は、copyをコンストラクション関数のパラメータとして指定します.
Pandas0.24.0以降:to_numpy()
pandas 0.24.0でto_numpy()メソッドがpandasに追加されました.DataFrameとpandas.Series.numpyを返します.ndarrayは、上記のプロパティ値に似ています.
公式ドキュメント推奨to_numpy()メソッドは値属性の代わりに使用されますが、0.25.1バージョンから値属性を使用しても警告はありません.
デフォルトでは、ビュー(共有メモリのnumpy.ndarray)と値プロパティが返される場合があります.
copyパラメータがTrueの場合、コピーが返されます.デフォルトはcopy=Falseです.
デフォルト(copy=False)は、ビューではなくコピーを返すこともできます.copy=Trueは常にコピーを返しますが、copy=Falseは必ずしもビューを返すわけではありません.
上記の値のプロパティがコピーを返すと、デフォルト値(copy=False)もコピーになります.
パラメータdtypeを使用してデータ型を指定できます.データ型が変更された場合は、コピーも返されます.
pandas.DataFrame,pandas.SeriesとNumPyはnumpyを配列する.ndarray相互关系可以转换.
各例はサンプルコードで説明されます.
またpandas.DataFrameとpandas.Seriesはas_とも呼ばれるmatrix()のメソッドでnumpyを返す.ndarrayは、バージョン0.23.0以降は廃止されています(使用には賛成しません).
Pandasを取得DataFrame,Series属性値のNumPy配列ndarray
pandas.DataFrameとpandas.Seriesは、値属性を持つNumPy配列numpyを取得することができる.ndarray.pandas 0.24.0から、末尾に導入されたto_を使用することを推奨します.numpy()メソッド.
pandas.DataFrame.
import numpy as np
import pandas as pd
df = pd.DataFrame(data=[[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
print(df)
# a b c
# 0 1 2 3
# 1 4 5 6
a_df = df.values
print(a_df)
# [[1 2 3]
# [4 5 6]]
print(type(a_df))
#
print(a_df.dtype)
# int64
pandas.Series.
s = df['a']
print(s)
# 0 1
# 1 4
# Name: a, dtype: int64
a_s = s.values
print(a_s)
# [1 4]
print(type(a_s))
#
print(a_s.dtype)
# int64
取得可能なndarrayのデータ型dtypeと元のpandas.DataFrameとpandas.Seriesのdtypeは同じです.
df_f = pd.DataFrame([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]])
print(df_f)
# 0 1 2
# 0 0.1 0.2 0.3
# 1 0.4 0.5 0.6
a_df_f = df_f.values
print(a_df_f)
# [[0.1 0.2 0.3]
# [0.4 0.5 0.6]]
print(type(a_df_f))
#
print(a_df_f.dtype)
# float64
Pandas.DataFrameは数字と文字列の組み合わせで、オブジェクトタイプndarrayです.
df_multi = pd.read_csv('./data/31/sample_pandas_normal.csv')
print(df_multi)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
a_df_multi = df_multi.values
print(a_df_multi)
# [['Alice' 24 'NY' 64]
# ['Bob' 42 'CA' 92]
# ['Charlie' 18 'CA' 70]
# ['Dave' 68 'TX' 70]
# ['Ellen' 24 'CA' 88]
# ['Frank' 30 'NY' 57]]
print(type(a_df_multi))
#
print(a_df_multi.dtype)
# object
DataFrameの特定のカラムのみをndarrayに変換する場合は、そのカラムを抽出するDataFrameの値を取得できます.カラム抽出については、次の文書を参照してください.
カラム数が1つしか選択されていない場合、ndarrayのタイプはobjectではなくそのタイプになります.
a_df_int = df_multi[['age', 'point']].values
print(a_df_int)
# [[24 64]
# [42 92]
# [18 70]
# [68 70]
# [24 88]
# [30 57]]
print(type(a_df_int))
#
print(a_df_int.dtype)
# int64
場合によっては、使用する.Tはもっと簡単かもしれません.
print(a_df_int.T)
# [[24 42 18 68 24 30]
# [64 92 70 70 88 57]]
特定のタイプのカラムのみを抽出する条件を指定することもできます.たとえば、int 64タイプのカラムのみを抽出したい場合は、以下のように記述できます.
a_df_int = df_multi.select_dtypes(include=int).values
print(a_df_int)
# [[24 64]
# [42 92]
# [18 70]
# [68 70]
# [24 88]
# [30 57]]
print(type(a_df_int))
#
print(a_df_int.dtype)
# int64
selectの使用についてdtypes()データ型dtypeでカラムを抽出する方法については、次の文書を参照してください.
NumPy配列ndarrayからpandasを生成する.DataFrame,Series
いいですよDataFrameとpandas.Seriesのコンストラクション関数の最初のパラメータデータにNumPy配列numpyを指定する.ndarray.後述するようにnumpy.ndarrayと生成されたpandas.DataFrameとpandas.Series共有メモリ.
生成pandas.Series
コンストラクション関数に他のパラメータが指定されていない場合は、元のndarrayタイプのSeriesになります.
import numpy as np
import pandas as pd
a = np.arange(4)
print(a)
# [0 1 2 3]
s = pd.Series(a)
print(s)
# 0 0
# 1 1
# 2 2
# 3 3
# dtype: int64
インデックス名index、シリーズ名、データ型dtypeなどをパラメータとして指定することもできます.
index = ['A', 'B', 'C', 'D']
name = 'sample'
s = pd.Series(data=a, index=index, name=name, dtype='float')
print(s)
# A 0.0
# B 1.0
# C 2.0
# D 3.0
# Name: sample, dtype: float64
Seriesコンストラクション関数でデータに多次元ndarrayを指定するとエラーが発生します.
a = np.arange(12).reshape((4, 3))
print(a)
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
# s = pd.Series(a)
# print(s)
# Exception: Data must be 1-dimensional
例えば、2 Dndarrayの行と列を選択してpandasに変換することができる.Series.
s = pd.Series(a[2])
print(s)
# 0 6
# 1 7
# 2 8
# dtype: int64
s = pd.Series(a.T[2])
print(s)
# 0 2
# 1 5
# 2 8
# 3 11
# dtype: int64
生成pandas.DataFrame
Seriesと同様に、コンストラクション関数に他のパラメータが指定されていない場合は、元のndarrayタイプのDataFrameになります.
a = np.arange(12).reshape((4, 3))
print(a)
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
df = pd.DataFrame(a)
print(df)
# 0 1 2
# 0 0 1 2
# 1 3 4 5
# 2 6 7 8
# 3 9 10 11
パラメータを使用して、行名インデックス、列名列、データ型dtypeなどを指定することもできます.
index = ['A', 'B', 'C', 'D']
columns = ['a', 'b', 'c']
df = pd.DataFrame(data=a, index=index, columns=columns, dtype='float')
print(df)
# a b c
# A 0.0 1.0 2.0
# B 3.0 4.0 5.0
# C 6.0 7.0 8.0
# D 9.0 10.0 11.0
メモリ共有に関する注意事項(表示とコピー)
値属性またはコンストラクション関数によって相互に変換するPandas.DataFrameまたはpandas.Seriesとnumpy.ndarrayは互いにメモリを共有する可能性があります.共有メモリ(1つが別のビュー)の場合、1つの値を変更すると別の値が変更されます.それらを別々に処理して使用する場合は、必ず注意してください.
次のサンプルコードおよびその結果は、パンダ0.25.1から得られる.動作はバージョンによって異なる場合があります.
valuesプロパティ
まず、以下の場合.
df = pd.DataFrame(data=[[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
print(df)
# a b c
# 0 1 2 3
# 1 4 5 6
a_values = df.values
print(a_values)
# [[1 2 3]
# [4 5 6]]
値はビューを返し、値を変更すると別の値が変更されます.np.shares_memory()OK.
print(np.shares_memory(a_values, df))
# True
a_values[0, 0] = 100
print(a_values)
# [[100 2 3]
# [ 4 5 6]]
print(df)
# a b c
# 0 100 2 3
# 1 4 5 6
常にビューを返すわけではありません.たとえば、各カラムに異なるデータ型dtaepがある場合は、コピーを返します.
df_if = pd.DataFrame(data=[[1, 0.1], [2, 0.2]], columns=['int', 'float'])
print(df_if)
# int float
# 0 1 0.1
# 1 2 0.2
print(df_if.dtypes)
# int int64
# float float64
# dtype: object
a_values_if = df_if.values
print(a_values_if)
# [[1. 0.1]
# [2. 0.2]]
print(np.shares_memory(a_values_if, df_if))
# False
a_values_if[0, 0] = 100
print(a_values_if)
# [[100. 0.1]
# [ 2. 0.2]]
print(df_if)
# int float
# 0 1 0.1
# 1 2 0.2
また、行や列などの範囲を指定して値を取得する場合、ビューやコピーは指定方法によって異なる場合があります.
print(df[['a', 'c']].values)
# [[100 3]
# [ 4 6]]
print(np.shares_memory(df[['a', 'c']].values, df))
# False
print(df.iloc[:, ::2].values)
# [[100 3]
# [ 4 6]]
print(np.shares_memory(df.iloc[:, ::2].values, df))
# True
ビューに問題がある場合は、値のcopy()を使用してコピーを明示的に作成できます.
a_values_copy = df.values.copy()
print(a_values_copy)
# [[100 2 3]
# [ 4 5 6]]
print(np.shares_memory(a_values_copy, df))
# False
a_values_copy[0, 0] = 10
print(a_values_copy)
# [[10 2 3]
# [ 4 5 6]]
print(df)
# a b c
# 0 100 2 3
# 1 4 5 6
pandas.DataFrame,pandas.Seriesの構造方法
numpy.ndarrayはコンストラクション関数pandasに渡す.DataFrame()とpandas.Series()の場合、メモリを共有します.1つの値を変更すると、別の値も変更されます.
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
# [[1 2 3]
# [4 5 6]]
df_a = pd.DataFrame(a, columns=['a', 'b', 'c'])
print(df_a)
# a b c
# 0 1 2 3
# 1 4 5 6
print(np.shares_memory(a, df_a))
# True
a[0, 0] = 100
print(a)
# [[100 2 3]
# [ 4 5 6]]
print(df_a)
# a b c
# 0 100 2 3
# 1 4 5 6
df_a.iat[1, 0] = 10
print(df_a)
# a b c
# 0 100 2 3
# 1 10 5 6
print(a)
# [[100 2 3]
# [ 10 5 6]]
メモリを共有したくない場合はnumpyを使用します.ndarrayのcopy()は、copyをコンストラクション関数のパラメータとして指定します.
df_a_copy = pd.DataFrame(a.copy(), columns=['a', 'b', 'c'])
print(df_a_copy)
# a b c
# 0 100 2 3
# 1 10 5 6
a[0, 0] = 1
print(a)
# [[ 1 2 3]
# [10 5 6]]
print(df_a_copy)
# a b c
# 0 100 2 3
# 1 10 5 6
Pandas0.24.0以降:to_numpy()
pandas 0.24.0でto_numpy()メソッドがpandasに追加されました.DataFrameとpandas.Series.numpyを返します.ndarrayは、上記のプロパティ値に似ています.
公式ドキュメント推奨to_numpy()メソッドは値属性の代わりに使用されますが、0.25.1バージョンから値属性を使用しても警告はありません.
df = pd.DataFrame(data=[[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
print(df)
# a b c
# 0 1 2 3
# 1 4 5 6
a = df.to_numpy()
print(a)
# [[1 2 3]
# [4 5 6]]
print(type(a))
#
デフォルトでは、ビュー(共有メモリのnumpy.ndarray)と値プロパティが返される場合があります.
print(np.shares_memory(df, a))
# True
a[0, 0] = 100
print(a)
# [[100 2 3]
# [ 4 5 6]]
print(df)
# a b c
# 0 100 2 3
# 1 4 5 6
copyパラメータがTrueの場合、コピーが返されます.デフォルトはcopy=Falseです.
a_copy = df.to_numpy(copy=True)
print(a_copy)
# [[100 2 3]
# [ 4 5 6]]
print(np.shares_memory(df, a_copy))
# False
a_copy[0, 0] = 10
print(a_copy)
# [[10 2 3]
# [ 4 5 6]]
print(df)
# a b c
# 0 100 2 3
# 1 4 5 6
デフォルト(copy=False)は、ビューではなくコピーを返すこともできます.copy=Trueは常にコピーを返しますが、copy=Falseは必ずしもビューを返すわけではありません.
上記の値のプロパティがコピーを返すと、デフォルト値(copy=False)もコピーになります.
a_cols = df[['a', 'c']].to_numpy()
print(a_cols)
# [[100 3]
# [ 4 6]]
print(np.shares_memory(df, a_cols))
# False
パラメータdtypeを使用してデータ型を指定できます.データ型が変更された場合は、コピーも返されます.
a_f = df.to_numpy(dtype=float)
print(a_f)
# [[100. 2. 3.]
# [ 4. 5. 6.]]
print(np.shares_memory(df, a_f))
# False