python pandasモジュール基礎学習詳細


PandsはR言語のデータボックス(DataFrame)と同様であり、PandsはNumpyに基づくが、データボックス構造の処理はNumpyに比べて容易である。
1.Pandsの基本データ構造と使用
Pandsは二つの主要なデータ構造があります。SeriesとDataFrameです。SeriesはNumpyの一次元配列と似ていますが、DataFrameは多次元表データ構造を多く使用しています。
Seriesの作成

>>>import numpy as np
>>>import pandas as pd
>>>s=pd.Series([1,2,3,np.nan,44,1]) # np.nan        
>>>s #     ,Series     index,        0-5
0   1.0
1   2.0
2   3.0
3   NaN
4  44.0
5   1.0
dtype: float64
DataFrameの作成

>>>dates=pd.date_range('20170101',periods=6)
>>>dates
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
        '2017-01-05', '2017-01-06'],
       dtype='datetime64[ns]', freq='D')
>>>df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
>>>df
           a     b     c     d
2017-01-01 -1.993447 1.272175 -1.578337 -1.972526
2017-01-02 0.092701 -0.503654 -0.540655 -0.126386
2017-01-03 0.191769 -0.578872 -1.693449 0.457891
2017-01-04 2.121120 0.521884 -0.419368 -1.916585
2017-01-05 1.642063 0.222134 0.108531 -1.858906
2017-01-06 0.636639 0.487491 0.617841 -1.597920
DataFrameはNumpyと同様にインデックスからデータを取り出すことができますが、DataFrameインデックス方式はもっと多様です。DataFrameは、デフォルトの行列番号に基づいて索引を行うだけでなく、ラベル系列に従ってインデックスを作成することもできます。
辞書を使ってDataFrameを作成することもできます。

>>>df2=pd.DataFrame({'a':1,'b':'hello kitty','c':np.arange(2),'d':['o','k']})
>>>df2
   a      b c d
0 1 hello kitty 0 o
1 1 hello kitty 1 k
DataFrameのいくつかの属性についても、対応する方法で見ることができます。

dtype #       
index #          
columns #        
values #          ,           
describe #          ,       ,  ,      ,            
transpose #   ,   T   
sort_index #   ,     index    
sort_values #        
いくつかの例

>>>df2.dtypes
a   int64
b  object
c   int64
d  object
dtype: object
>>>df2.index
RangeIndex(start=0, stop=2, step=1)
>>>df2.columns
Index(['a', 'b', 'c', 'd'], dtype='object')
>>>df2.values
array([[1, 'hello kitty', 0, 'o'],
    [1, 'hello kitty', 1, 'k']], dtype=object)
>>>df2.describe #             
     a     c
count 2.0 2.000000
mean  1.0 0.500000
std  0.0 0.707107
min  1.0 0.000000
25%  1.0 0.250000
50%  1.0 0.500000
75%  1.0 0.750000
max  1.0 1.000000
>>>df2.T
       0      1
a      1      1
b hello kitty hello kitty
c      0      1
d      o      k
>>>df2.sort_index(axis=1,ascending=False) # axis=1           
   d c      b a
0 o 0 hello kitty 1
1 k 1 hello kitty 1
>>>df2.sort_index(axis=0,ascending=False) #           
   a      b c d
1 1 hello kitty 1 k
0 1 hello kitty 0 o
>>>df2.sort_values(by="c",ascending=False) #  c         
   a      b c d
1 1 hello kitty 1 k
0 1 hello kitty 0 o
2.DataFrameから目的データを絞り出す
DataFrameから目的のデータを取り出す方法は様々です。
  • -直接インデックスに基づいて
  • を選択します。
  • -ラベルによる選択(縦選択列):loc
  • -シーケンス(横方向選択行)によると、iloc
  • -ラベルシーケンスを使用して特定の位置のデータを選択する。ix
  • -論理判定フィルタ
  • 簡単に選択
    
    >>>import numpy as np
    >>>import pandas as pd
    >>>dates=pd.date_range('20170101',periods=6)
    >>>df=pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['a','b','c','d'])
    >>>df
            a  b  c  d
    2017-01-01  0  1  2  3
    2017-01-02  4  5  6  7
    2017-01-03  8  9 10 11
    2017-01-04 12 13 14 15
    2017-01-05 16 17 18 19
    2017-01-06 20 21 22 23
    >>>df['a']     #         a ,   df.a,    
    2017-01-01   0
    2017-01-02   4
    2017-01-03   8
    2017-01-04  12
    2017-01-05  16
    2017-01-06  20
    Freq: D, Name: a, dtype: int64
    >>>df[0:3]  #    3 ,       df['2017-01-01':'2017-01-03'],    ,           
           a b  c  d
    2017-01-01 0 1  2  3
    2017-01-02 4 5  6  7
    2017-01-03 8 9 10 11
    locは明示的な行ラベルを使ってデータを選択します。
    DataFrame行の表現には、明示的な行ラベルによってインデックスされるものと、デフォルトの暗黙的な行番号によってインデックスされるものがあります。loc方法は、行ラベルによってターゲット行をインデックス化し、ラベルに合わせて特定の位置のデータを選択することができる。
    
    >>>df.loc['2017-01-01':'2017-01-03']
           a b  c  d
    2017-01-01 0 1  2  3
    2017-01-02 4 5  6  7
    2017-01-03 8 9 10 11
    >>>df.loc['2017-01-01',['a','b']]  #       a,b 
    a  0
    b  1
    Name: 2017-01-01 00:00:00, dtype: int64
    ilocは暗黙的な行のシリアル番号を使ってデータを選択します。
    ILocを使用すると、列のシリアル番号に合わせて、特定のビットのデータをより簡単に選択できます。
    
    >>>df.iloc[3,1]
    13
    >>>df.iloc[1:3,2:4]
            c  d
    2017-01-02  6  7
    2017-01-03 10 11
    ixはixを利用して明示的なラベルと暗黙的なシリアル番号を混用できます。
    locは、明示的なラベルのみを使用してデータを選択することができますが、ilocは、暗黙的なシリアル番号のみを使用してデータを選択することができます。ixは、両者を結合して使用することができます。
    
    >>> df.ix[3:5,['a','b']]
           a  b
    2017-01-04 12 13
    2017-01-05 16 17
    論理判定を使ってデータを選択します。
    
    >>>df
            a  b  c  d
    2017-01-01  0  1  2  3
    2017-01-02  4  5  6  7
    2017-01-03  8  9 10 11
    2017-01-04 12 13 14 15
    2017-01-05 16 17 18 19
    2017-01-06 20 21 22 23
    >>>df[df['a']>5] #    df[df.a>5]
            a  b  c  d
    2017-01-03  8  9 10 11
    2017-01-04 12 13 14 15
    2017-01-05 16 17 18 19
    2017-01-06 20 21 22 23
    3.Pands設定特定位置値
    
    >>>import numpy as np
    >>>import pandas as pd
    >>>dates=pd.date_range('20170101',periods=6)
    >>>datas=np.arange(24).reshape((6,4))
    >>>columns=['a','b','c','d']
    >>>df=pd.DataFra me(data=datas,index=dates,colums=columns)
    >>>df.iloc[2,2:4]=111 #   2 2,3        111
            a  b  c  d
    2017-01-01  0  1  2  3
    2017-01-02  4  5  6  7
    2017-01-03  8  9 111 111
    2017-01-04 12 13  14  15
    2017-01-05 16 17  18  19
    2017-01-06 20 21  22  23
    >>>df.b[df['a']>10]=0 #    df.b[df.a>10] #  a   10        ,  b        0
            a b  c  d
    2017-01-01  0 1  2  3
    2017-01-02  4 5  6  7
    2017-01-03  8 9 111 111
    2017-01-04 12 0  14  15
    2017-01-05 16 0  18  19
    2017-01-06 20 0  22  23
    >>>df['f']=np.nan  #   f       np.nan
           a b  c  d  f
    2017-01-01  0 1  2  3 NaN
    2017-01-02  4 5  6  7 NaN
    2017-01-03  8 9 111 111 NaN
    2017-01-04 12 0  14  15 NaN
    2017-01-05 16 0  18  19 NaN
    2017-01-06 20 0  22  23 NaN
    >>>
    #            `Series`  ,          
    >>>df['e']=pd.Series(np.arange(6),index=dates)
    >>>df
           a b  c  d  f e
    2017-01-01  0 1  2  3 NaN 0
    2017-01-02  4 5  6  7 NaN 1
    2017-01-03  8 9 111 111 NaN 2
    2017-01-04 12 0  14  15 NaN 3
    2017-01-05 16 0  18  19 NaN 4
    2017-01-06 20 0  22  23 NaN 5
    4.紛失データの処理
    私たちのデータにはいくつかの空きがあります。あるいは、(NaN)データが欠落しています。dropnaを使って、これらのNaNデータを選択的に削除したり、補填したりできます。drop関数は、行または列、drop_を選択的に削除することができます。duplicatesは冗長性を除去します。fillnaはNaN値を他の値に置き換える。操作後は元の値を変更せずに変更を保存するには再割り当てが必要です。
    
    >>>import numpy as np
    >>>import pandas as pd
    >>>df=pd.DataFrame(np.arange(24).reshape(6,4),index=pd.date_range('20170101',periods=6),columns=['a','b','c','d'])
    >>>df
           a  b  c  d
    2017-01-01  0  1  2  3
    2017-01-02  4  5  6  7
    2017-01-03  8  9 10 11
    2017-01-04 12 13 14 15
    2017-01-05 16 17 18 19
    2017-01-06 20 21 22 23
    >>>df.iloc[1,3]=np.nan
    >>>di.iloc[3,2]=np.nan
    >>>df.
           a  b   c   d
    2017-01-01  0  1  2.0  3.0
    2017-01-02  4  5  6.0  NaN
    2017-01-03  8  9 10.0 11.0
    2017-01-04 12 13  NaN 15.0
    2017-01-05 16 17 18.0 19.0
    2017-01-06 20 21 22.0 23.0
    >>>df.dropna(axis=0,how='any') # axis=0(1)     NaN  ( )  。
       # how='any'     (  , axis    )  NaN    ( )  ,
       # how='all'     ( )   NaN    
           a  b   c   d
    2017-01-01  0  1  2.0  3.0
    2017-01-03  8  9 10.0 11.0
    2017-01-05 16 17 18.0 19.0
    2017-01-06 20 21 22.0 23.0
    >>>df.fillna(value=55)
           a  b   c   d
    2017-01-01  0  1  2.0  3.0
    2017-01-02  4  5  6.0 55.0
    2017-01-03  8  9 10.0 11.0
    2017-01-04 12 13 55.0 15.0
    2017-01-05 16 17 18.0 19.0
    2017-01-06 20 21 22.0 23.0
    関数を利用して、データの中にNaNがあるかどうかを確認することもできます。
    
    >>>np.any(df.isnull())==True
    True
    >>>np.all(df.isnull())==True
    False
    5.データの導入とエクスポート
    一般的にexcelファイルはcsvで読み込まれます。pd.read_csv、dataはfiledata.to_に保存されます。csv(file)です。
    6.データ追加合併
    今回は主にPandsの簡単で基本的なデータ添加合併方法を勉強します。
    concat結合方式はNumpyのconcatentate方法と類似しており、横方向または縦方向の結合が可能である。
    
    >>>import numpy as np
    >>>import pandas as pd
    >>> df1=pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
    >>> df2=pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d'])
    >>> df3=pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d'])
    >>>res=pd.concat([df1,df2,df3],axis=0) 
    # axis=0        ,axis=1        
    >>>res
        a  b  c  d
    0 0.0 0.0 0.0 0.0
    1 0.0 0.0 0.0 0.0
    2 0.0 0.0 0.0 0.0
    0 1.0 1.0 1.0 1.0
    1 1.0 1.0 1.0 1.0
    2 1.0 1.0 1.0 1.0
    0 2.0 2.0 2.0 2.0
    1 2.0 2.0 2.0 2.0
    2 2.0 2.0 2.0 2.0
    >>>
    #   ignore_index=True         
    >>>res=pd.concat([df1,df2,df3],axis=0,ignore_index=True)
    >>>res
        a  b  c  d
    0 0.0 0.0 0.0 0.0
    1 0.0 0.0 0.0 0.0
    2 0.0 0.0 0.0 0.0
    3 1.0 1.0 1.0 1.0
    4 1.0 1.0 1.0 1.0
    5 1.0 1.0 1.0 1.0
    6 2.0 2.0 2.0 2.0
    7 2.0 2.0 2.0 2.0
    8 2.0 2.0 2.0 2.0
    ジョンパラメータは、より多くの様式化された統合方式を提供する。join=outerはデフォルトの値で、いくつかのマージされたデータを全部使って、同じ列のラベルを持っているものを一つにして、上下マージして、異なる列のラベルの独自の列を作って、もとは数値がない位置をNaNで埋めます。ジョイン=innerは同じ列のラベルを持つ列だけを上下に統合し、残りの列は破棄します。簡単に言うと、outerの代表が一緒になり、innerの代表が交差して**します。
    
    >>>import numpy as np
    >>>import pandas as pd
    >>>df1=pd.DataFrame(np.ones((3,4)),index=[1,2,3],columns=['a','b','c','d'])
    >>>df2=pd.DataFrame(np.ones((3,4))*2,index=[1,2,3],columns=['b','c','d','e'])
    >>>res=pd.concat([df1,df2],axis=0,join='outer')
    >>>res
        a  b  c  d  e
    1 1.0 1.0 1.0 1.0 NaN
    2 1.0 1.0 1.0 1.0 NaN
    3 1.0 1.0 1.0 1.0 NaN
    1 NaN 2.0 2.0 2.0 2.0
    2 NaN 2.0 2.0 2.0 2.0
    3 NaN 2.0 2.0 2.0 2.0
    >>>res1=pd.concat([df1,df2],axis=1,join='outer') 
     # axis=1                 ,       ,NaN    
    >>>res1
        a  b  c  d  b  c  d  e
    1 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
    2 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
    3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
    >>>res2=pd.concat([df1,df2],axis=0,join='inner',ignore_index=True) 
    #               
    >>>res2
       b  c  d
    0 1.0 1.0 1.0
    1 1.0 1.0 1.0
    2 1.0 1.0 1.0
    3 2.0 2.0 2.0
    4 2.0 2.0 2.0
    5 2.0 2.0 2.0
    ジョン.axesパラメータは参照系を設定し、設定の参考で結合し、参照系にないものは破棄します。
    
    >>>import numpy as np
    >>>import pandas as pd
    >>>df1=pd.DataFrame(np.ones((3,4)),index=[1,2,3],columns=['a','b','c','d'])
    >>> df2=pd.DataFrame(np.ones((3,4))*2,index=[2,3,4],columns=['b','c','d','e'])
    >>>res3=pd.concat([df1,df2],axis=0,join_axes=[df1.columns])
    #  df1                    
    >>>res3
        a  b  c  d
    1 1.0 1.0 1.0 1.0
    2 1.0 1.0 1.0 1.0
    3 1.0 1.0 1.0 1.0
    2 NaN 2.0 2.0 2.0
    3 NaN 2.0 2.0 2.0
    4 NaN 2.0 2.0 2.0
    >>>res4=pd.concat([df1,df2],axis=1,join_axes=[df1.index])
    #  df1      ,              
        a  b  c  d  b  c  d  e
    1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
    2 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
    3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
    appedは上下合併のみで、左右合併はありません。
    
    >>>df1=pd.DataFrame(np.ones((3,4)),index=[1,2,3],columns=['a','b','c','d'])
    >>> df2=pd.DataFrame(np.ones((3,4))*2,index=[2,3,4],columns=['b','c','d','e'])
    >>>res5=df1.append(df2,ignore_index=True)
    >>>res5
        a  b  c  d  e
    0 1.0 1.0 1.0 1.0 NaN
    1 1.0 1.0 1.0 1.0 NaN
    2 1.0 1.0 1.0 1.0 NaN
    3 NaN 2.0 2.0 2.0 2.0
    4 NaN 2.0 2.0 2.0 2.0
    5 NaN 2.0 2.0 2.0 2.0
    7.Pands高級合併:merge
    merge合併はconcatと似ていますが、mergeは一つ以上のキーで二つのデータセットの行を連結することができます。
    
    merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, 
    sort=False, suffixes=('_x', '_y'), copy=True, indicator=False)
    パラメータの説明:
  • leftとright:2つの異なるDataFrame
  • how:合併(接続)の方式はinner(内部接続)、left(左外接続)、right(右外接続)、outer(全外接続)である。デフォルトはinner
  • です。
  • on:接続のための列インデックスの名前です。右の2つのDataFrameオブジェクトが存在しなければならないが、指定されておらず、他のパラメータも指定されていない場合は、2つのDataFrameの列名をインターリーブして接続キー
  • とする。
  • left_左のDataFrameに接続キーとして使われる列名。このパラメータでは左右の列名が異なりますが、同じ意味で表す場合には非常に有用です。
  • right_on:右側のDataFrameで接続キーとして使用される列名
  • left_index:左のDataFrameの行インデックスを接続キーとして使用する
  • right_index:右側DataFrameの行インデックスを接続キーとして使用する
  • sort:デフォルトはTrueで、統合されたデータを並べ替えます。ほとんどの場合、Falseに設定すると、性能を向上させることができる
  • suffixes:文字列の値からなるタプルは、左右のDataFrameが同じ列名が存在する場合、列名の後に付加されるサフィックス名を指定します。x,'uy')
  • copy:デフォルトはTrueで、いつもデータをデータ構造にコピーします。ほとんどの場合Falseに設定されているので、性能を向上させることができます。
  • indicator:統合データのソース状況を表示します。自分だけが左に来たらオンリー、両方(both)
  • 
    >>>import pandas as pd
    >>>df1=pd.DataFrame({'key':['k0','k1','k2','k3'],'A':['a0','a1','a2','a3'],'B':['b0','b1','b2','b3']})
    >>>df2=pd.DataFrame({'key':['k0','k1','k2','k3'],'C':['c0','c1','c2','c3'],'D':['d0','d1','d2','d3']})
    >>> res=pd.merge(df1,df2,on='key',indicator=True)
    >>>res
      A  B key  C  D _merge
    0 a0 b0 k0 c0 d0  both
    1 a1 b1 k1 c1 d1  both
    2 a2 b2 k2 c2 d2  both
    3 a3 b3 k3 c3 d3  both
    行index結合による列key結合の使い方と類似しています。
    
    >>>res2=pd.merge(df1,df2,left_index=True,right_index=True,indicator=True)
    >>>res2
      A  B key_x  C  D key_y _merge
    0 a0 b0  k0 c0 d0  k0  both
    1 a1 b1  k1 c1 d1  k1  both
    2 a2 b2  k2 c2 d2  k2  both
    3 a3 b3  k3 c3 d3  k3  both
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。