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.
    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の値を取得できます.カラム抽出については、次の文書を参照してください.
  • 28_Pandasはindexにより行と列
  • を選択して取得する.
    カラム数が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でカラムを抽出する方法については、次の文書を参照してください.
  • 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になります.
    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