Pands学習ノート1-基本操作

12916 ワード

Pandsは2種類のデータ構造タイプがあります.一つはSeries、もう一つはDataFrameです.
Series
Seriesは1次元のデータ構造で、辞書やNumpyの要素のラベル付き配列のようです.でも辞書より強いです.各要素にはラベル(索引)があります.ラベルは数字または文字列となります.索引を持っていて、キーの値を持って関係に対応して、並べ替えることができて、切れのSliceなどの操作を切ります.
Data Frame
DataFrameは二次元の表構造である.PandsのDataFrameは多くの異なるデータタイプを記憶することができますが、各列のデータは同じデータタイプであり、各軸には独自のラベル(索引)があります.それをSeriesの辞書の項に想像できます.
1.1 Seriesの作成
リストを利用してSeriesを作成します.Pandsはデフォルトでインデックス全体を作成します.
import pandas as pd
import numpy as np

s =pd.Series([0,1,2,3,4,np.NAN,5,'A'])

In [74]:s
Out[74]: 
0      0
1      1
2      2
3      3
4      4
5    NaN
6      5
7      A
dtype: object
2.1 Data Frameを作成する
方法1:配列arrayを使用して、索引、列名を指定します.
dates = pd.date_range('20130101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['A','B','C','D'])
In [76]:df
Out[76]: 
                   A         B         C         D
2013-01-01 -2.359309 -0.065001  1.099911 -0.886392
2013-01-02  0.318336  0.715261  0.060752  1.326758
2013-01-03  0.515914  1.482326 -0.973154  1.766126
2013-01-04  1.875221 -0.316619 -0.543997  0.864037
2013-01-05 -0.697887  0.065137 -0.899040  0.826392
2013-01-06 -0.205943 -1.532289  1.849114  1.267895
方法2:辞書を使ってDataFrameを作成します.
df2 = pd.DataFrame({'A':1,
                    'B':pd.Timestamp('20130102'),
                    'C':pd.Series(1,index=range(4)),
                    'D':np.array([3]*4,dtype='int'),
                    'E':'foo'})

In [78]:df2
Out[78]: 
   A          B  C  D    E
0  1 2013-01-02  1  3  foo
1  1 2013-01-02  1  3  foo
2  1 2013-01-02  1  3  foo
3  1 2013-01-02  1  3  foo
2.1.1一般的な基本機能
1、確認前のN行または後のM行のデータ
In [80]:df.head(2)
Out[80]: 
                   A         B         C         D
2013-01-01 -2.359309 -0.065001  1.099911 -0.886392
2013-01-02  0.318336  0.715261  0.060752  1.326758
In [81]:df.tail(2)
Out[81]: 
                   A         B         C         D
2013-01-05 -0.697887  0.065137 -0.899040  0.826392
2013-01-06 -0.205943 -1.532289  1.849114  1.267895
2、索引を表示する
In [82]:df.index
Out[82]: 

[2013-01-01, ..., 2013-01-06]
Length: 6, Freq: D, Timezone: None
3、表示値
In [83]:df.values
Out[83]: 
array([[-2.35930948, -0.06500052,  1.09991148, -0.88639213],
       [ 0.31833619,  0.71526129,  0.06075226,  1.32675777],
       [ 0.51591397,  1.48232627, -0.97315391,  1.76612637],
       [ 1.87522057, -0.31661914, -0.54399686,  0.86403681],
       [-0.69788733,  0.06513657, -0.89903951,  0.82639165],
       [-0.20594297, -1.53228941,  1.84911405,  1.26789462]])
4、列名を表示する
In [84]:df.columns
Out[84]: Index([u'A', u'B', u'C', u'D'], dtype='object')In [85]: 

In [85]:df.dtypes
Out[85]: 
A    float64
B    float64
C    float64
D    float64
dtype: object
5、データを調べて何行ありますか?
In [74]:len(df)
Out[74]: 6
6、データSummary情報を見る(平均、分散、最小、最大、桁数)
In [9]:df.describe()
Out[9]: 
              A         B         C         D
count  6.000000  6.000000  6.000000  6.000000
mean   0.329473  0.087595 -0.172075  0.308271
std    0.595492  1.106105  0.524659  0.864240
min   -0.218562 -1.454443 -0.992808 -0.790523
25%    0.112395 -0.458519 -0.362685 -0.434517
50%    0.135337  0.000715 -0.197997  0.653177
75%    0.281296  0.630096  0.137386  0.864773
max    1.490029  1.750290  0.524751  1.195568
7、まったく同じオブジェクトをコピーする
In [11]:df2 = df.copy()  
In [11]:df2
Out[11]: 
                   A         B         C         D
2013-01-01  0.134964 -1.454443 -0.310064  1.195568
2013-01-02  1.490029 -0.561749  0.524751  0.522473
2013-01-03  0.329824  1.750290 -0.085930  0.891737
2013-01-04  0.135711 -0.148830 -0.380225 -0.753513
2013-01-05  0.104873  0.150260  0.211825 -0.790523
2013-01-06 -0.218562  0.790041 -0.992808  0.783881
8、データを行列に変換する
In [12]:df.T
Out[12]: 
   2013-01-01  2013-01-02  2013-01-03  2013-01-04  2013-01-05  2013-01-06
A    0.134964    1.490029    0.329824    0.135711    0.104873   -0.218562
B   -1.454443   -0.561749    1.750290   -0.148830    0.150260    0.790041
C   -0.310064    0.524751   -0.085930   -0.380225    0.211825   -0.992808
D    1.195568    0.522473    0.891737   -0.753513   -0.790523    0.783881  
9、データを行列に変換する
In [12]:df.T
Out[12]: 
   2013-01-01  2013-01-02  2013-01-03  2013-01-04  2013-01-05  2013-01-06
A    0.134964    1.490029    0.329824    0.135711    0.104873   -0.218562
B   -1.454443   -0.561749    1.750290   -0.148830    0.150260    0.790041
C   -0.310064    0.524751   -0.085930   -0.380225    0.211825   -0.992808
D    1.195568    0.522473    0.891737   -0.753513   -0.790523    0.783881  
10、データを行列に変換する
df.set_index=df['A']
11、データを行列に変換する
In [74]:df2.columns = ['E','F','G','H']
In [74]:df2
Out[74]: 
                   E         F         G         H
2013-01-01  0.134964 -1.454443 -0.310064  1.195568
2013-01-02  1.490029 -0.561749  0.524751  0.522473
2013-01-03  0.329824  1.750290 -0.085930  0.891737
2013-01-04  0.135711 -0.148830 -0.380225 -0.753513
2013-01-05  0.104873  0.150260  0.211825 -0.790523
2013-01-06 -0.218562  0.790041 -0.992808  0.783881
2.1.2選択、フィルタ、スライス等の操作を行う
索引、ラベル(索引)に従って行の操作を行います.
  • locは文字列ラベルの索引方法であり、
  • ilocは、数字ラベルの索引方法であり、
  • ixは文字列ラベルのインデックス方法であり、同様に数字ラベルインデックスをその代替としてサポートしている.
  • 注:ixは文字と数字のスライスをサポートしていますが、いくつかの軽微な予測不可能性があります.数字ラベルはixに変なことをさせる可能性があります.例えば、数字を位置に解釈します.locとilocは安全で予測できるものを持ってきました.ixはlocとilocより速いです.locは文字列を索引としていますが、インデックスが数字の場合は、locもインデックスを作成できます.ちょっと矛盾しているようです.実用的な経験が必要です.
    1、列を選択する
    -    、df['A']
    -    、df.A
    -    、df.loc[:,['A']]
    
    In [20]:df['A']
    Out[20]: 
    2013-01-01    0.134964
    2013-01-02    1.490029
    2013-01-03    0.329824
    2013-01-04    0.135711
    2013-01-05    0.104873
    2013-01-06   -0.218562
    Freq: D, Name: A, dtype: float64
    
    2、2列または複数列を選択する
    -    、df[['A','B']]
    -    、df.loc[:,['A','B']]
    -    、df.ix[:,['A','B']]
    
    In [20]:df[['A','B']]
    Out[29]: 
                       A         B
    2013-01-01  0.134964 -1.454443
    2013-01-02  1.490029 -0.561749
    2013-01-03  0.329824  1.750290
    2013-01-04  0.135711 -0.148830
    2013-01-05  0.104873  0.150260
    2013-01-06 -0.218562  0.790041
    
    3、ある列または数列に基づいて条件フィルタを行います.
    In [30]:df[(df.A>0) & (df.B<0)]
    Out[30]: 
                       A         B         C         D
    2013-01-01  0.134964 -1.454443 -0.310064  1.195568
    2013-01-02  1.490029 -0.561749  0.524751  0.522473
    2013-01-04  0.135711 -0.148830 -0.380225 -0.753513
    
    4、インデックスは数字の使い方であるiloc
    In [35]: df1 = pd.DataFrame(np.random.randn(4,4),index=[1,2,3,4],columns=['A','B','C','D'])
    In [36]: df1
    Out[36]: 
              A         B         C         D
    1  0.913335 -0.209641 -0.994628 -0.300057
    2  1.260923  0.405731 -0.566145 -1.114782
    3  0.437972  1.800594 -0.269038 -0.038466
    4 -0.239472  0.290871  0.207056  0.105834
    
    #     
    In [40]: df.iloc[3]
    Out[40]: 
    A    0.135711
    B   -0.148830
    C   -0.380225
    D   -0.753513
    Name: 2013-01-04 00:00:00, dtype: float64
    
    #  df1      ,        loc iloc   
    In [25]:df1.loc[1:2]
    Out[25]: 
              A         B         C         D
    1 -0.762372 -0.390335  0.037414  2.104834
    2  1.265755 -0.113307  1.443822 -2.765101
    
    In [26]:df1.iloc[1:2]
    Out[26]: 
              A         B         C         D
    2  1.265755 -0.113307  1.443822 -2.765101
    
    #         
    In [69]:df.iloc[1:3,:]
    Out[69]: 
                       A         B         C         D
    2013-01-02  1.490029 -0.561749  0.524751  0.522473
    2013-01-03  0.329824  1.750290 -0.085930  0.891737
    
    #         ,       
    In [70]:df.iloc[0:2,0:3]
    Out[70]: 
                       A         B         C
    2013-01-01  0.134964 -1.454443 -0.310064
    2013-01-02  1.490029 -0.561749  0.524751
    
    #        ,    1,2,4 , 0,2 
    In [71]:df.iloc[[1,2,4],[0,2]]
    Out[71]: 
                       A         C
    2013-01-02  1.490029  0.524751
    2013-01-03  0.329824 -0.085930
    2013-01-05  0.104873  0.211825
    
    5、索引は数字ではなく、文字の使用locです.
    #   Date  '2013-01-03':'2013-01-05'  
    In [54]:df.loc['2013-01-03':'2013-01-05']
    Out[54]: 
                       A        B         C         D
    2013-01-03  0.329824  1.75029 -0.085930  0.891737
    2013-01-04  0.135711 -0.14883 -0.380225 -0.753513
    2013-01-05  0.104873  0.15026  0.211825 -0.790523
    
    In [55]:df.ix['2013-01-03':'2013-01-05']
    Out[55]: 
                       A        B         C         D
    2013-01-03  0.329824  1.75029 -0.085930  0.891737
    2013-01-04  0.135711 -0.14883 -0.380225 -0.753513
    2013-01-05  0.104873  0.15026  0.211825 -0.790523
    
    # 1 3 
    In [53]:df.iloc[:,1:3]
    Out[53]: 
                       B         C
    2013-01-01 -1.454443 -0.310064
    2013-01-02 -0.561749  0.524751
    2013-01-03  1.750290 -0.085930
    2013-01-04 -0.148830 -0.380225
    2013-01-05  0.150260  0.211825
    2013-01-06  0.790041 -0.992808
    
    #  3 5 ,A、B 
    In [52]:df.loc['2013-01-03':'2013-01-05',['A','B']]
    Out[52]: 
                       A        B
    2013-01-03  0.329824  1.75029
    2013-01-04  0.135711 -0.14883
    2013-01-05  0.104873  0.15026
    
    In [56]:df.ix[1:2]
    Out[56]: 
                       A         B         C         D
    2013-01-02  1.490029 -0.561749  0.524751  0.522473
    
    6、並べ替え
    #     
    In [57]:df.sort_index(ascending=False)
    Out[57]: 
                       A         B         C         D
    2013-01-06 -0.218562  0.790041 -0.992808  0.783881
    2013-01-05  0.104873  0.150260  0.211825 -0.790523
    2013-01-04  0.135711 -0.148830 -0.380225 -0.753513
    2013-01-03  0.329824  1.750290 -0.085930  0.891737
    2013-01-02  1.490029 -0.561749  0.524751  0.522473
    2013-01-01  0.134964 -1.454443 -0.310064  1.195568
    
    
    #         
    In [58]:df.sort(columns='B')
    Out[58]: 
                       A         B         C         D
    2013-01-01  0.134964 -1.454443 -0.310064  1.195568
    2013-01-02  1.490029 -0.561749  0.524751  0.522473
    2013-01-04  0.135711 -0.148830 -0.380225 -0.753513
    2013-01-05  0.104873  0.150260  0.211825 -0.790523
    2013-01-06 -0.218562  0.790041 -0.992808  0.783881
    2013-01-03  0.329824  1.750290 -0.085930  0.891737
    
    
    
    #         
    In [59]:df.sort(columns=['A','B'])
    Out[59]: 
                       A         B         C         D
    2013-01-06 -0.218562  0.790041 -0.992808  0.783881
    2013-01-05  0.104873  0.150260  0.211825 -0.790523
    2013-01-01  0.134964 -1.454443 -0.310064  1.195568
    2013-01-04  0.135711 -0.148830 -0.380225 -0.753513
    2013-01-03  0.329824  1.750290 -0.085930  0.891737
    2013-01-02  1.490029 -0.561749  0.524751  0.522473
    
    
    
    7、欠損値処理
    In [66]:df3 = df.reindex(index=dates[0:4], columns = list(df.columns)+['E'])
    In [66]:df3.loc[dates[0]:dates[1],['E']]=1
    In [66]:df3
    Out[63]: 
                       A         B         C         D   E
    2013-01-01  0.134964 -1.454443 -0.310064  1.195568   1
    2013-01-02  1.490029 -0.561749  0.524751  0.522473   1
    2013-01-03  0.329824  1.750290 -0.085930  0.891737 NaN
    2013-01-04  0.135711 -0.148830 -0.380225 -0.753513 NaN
    
    
    #      
    In [60]: df3.dropna(how='any')
    Out[60]: 
                       A         B         C         D  E
    2013-01-01  0.134964 -1.454443 -0.310064  1.195568  1
    2013-01-02  1.490029 -0.561749  0.524751  0.522473  1
    
    
    #         
    In [68]:df3.fillna(value=5)
    Out[68]: 
                       A         B         C         D  E
    2013-01-01  0.134964 -1.454443 -0.310064  1.195568  1
    2013-01-02  1.490029 -0.561749  0.524751  0.522473  1
    2013-01-03  0.329824  1.750290 -0.085930  0.891737  5
    2013-01-04  0.135711 -0.148830 -0.380225 -0.753513  5
    
    
    2.1.3関数の評価及びAppleの使用方法
    In [69]:df.mean()
    Out[69]: 
    A    0.634212
    B   -0.517503
    C   -0.360313
    D   -0.178633
    dtype: float64
    
    
    In [70]:df.apply(np.cumsum)
    Out[70]: 
                       A         B         C         D
    2013-01-01 -1.083703 -0.984847  0.231595  0.764466
    2013-01-02 -0.277971 -0.737865 -0.366301 -0.768202
    2013-01-03 -0.271485 -1.006928 -0.246741 -0.483353
    2013-01-04  2.491598  0.096372 -2.159432 -0.331738
    2013-01-05  2.624991 -1.882532 -2.445247 -1.636275
    2013-01-06  3.805273 -3.105017 -2.161877 -1.071797
    
    In [71]:df.apply(lambda x: x.max() - x.min())
    Out[71]: 
    A    3.846786
    B    3.082203
    C    2.196061
    D    2.297133
    dtype: float64
    
    
    
    未完のままPands学習ノート2で勉強を続けます.