Pandasデータ分析-第二章(Pandasデータ構造Dataframe)


Pandasデータ分析-第二章(Pandas入門:データ構造Dareframe)
第一章:Pandasデータ構造SeriesにはSeriesの文章が添付されており、Dataframeを見る前にSeriesとは何かを理解しなければならない.
DataFrame
DataFrameは表型のデータ構造です(表はわかります).各列は、詩の異なる値タイプ(数値、文字列、ブール値)であってもよく、Seriesからなる辞書として理解され、Seriesを振り返ると、Seriesは1次元配列であり、インデックス付きの1次元配列である.DataFrameはSeriesで構成された「辞書」と理解できる.実はDataFrameの中のデータは1つ以上の2次元ブロックで保存されています(リスト辞書ではありません)、もちろん具体的に何なのかはここで議論しても意味がありません.最も重要なのはDataFrameがどのように使われているのかです.もう1つのDataFrameは本当に使いやすくて、とても使いやすくて、普通ではありません.使いやすい!こうやって長いことしゃべったが,具体的な例を見てみればわかる.
DataFrameを構築する方法はいろいろありますが、最も一般的なのは辞書を渡すことです(リストでもいいです)
In [34]: data = {'location':['beijing','hebei','tianjin','shandong'],'year':[2011,2013,2019,1998],'num':[1.4,1.8,-2.1,3.6]}                                                                                  

In [35]: data                                                                                                                                                                                                
Out[35]: 
{'location': ['beijing', 'hebei', 'tianjin', 'shandong'],
 'year': [2011, 2013, 2019, 1998],
 'num': [1.4, 1.8, -2.1, 3.6]}

In [36]: df = pd.DataFrame(data)                                                                                                                                                                             

In [37]: df                                                                                                                                                                                                  
Out[37]: 
   location  year  num
0   beijing  2011  1.4
1     hebei  2013  1.8
2   tianjin  2019 -2.1
3  shandong  1998  3.6

入力される辞書にも制限があり、すべての辞書の「値」は等長のリストまたはSeriesでなければなりません.辞書のキーはcolumnsを生成し、もちろんindexとcolumnsを自分で設定することもできます.
In [50]: data = {'location':['beijing','hebei','tianjin','shandong'],'year':[2011,2013,2019,1998],'num':[1.4,1.8,-2.1,3.6]}                                                                                  

In [51]: df = pd.DataFrame(data,index=['a','b','c','d'],columns=['year','num','location','shit'])                                                                                                            

In [52]: df                                                                                                                                                                                                  
Out[52]: 
   year  num  location shit
a  2011  1.4   beijing  NaN
b  2013  1.8     hebei  NaN
c  2019 -2.1   tianjin  NaN
d  1998  3.6  shandong  NaN

columnsの順序を変更することでカラムの順序を制御でき、入力されたカラムがデータに見つからないとNA値が生成されます.
ディクショナリでは、DataFrameのカラムをSeriesとして取得できます.
In [53]: df['year']                                                                                                                                                                                          
Out[53]: 
a    2011
b    2013
c    2019
d    1998
Name: year, dtype: int64

In [54]: df.location                                                                                                                                                                                         
Out[54]: 
a     beijing
b       hebei
c     tianjin
d    shandong
Name: location, dtype: object

では、1行を取るにはどうすればいいのでしょうか.
In [55]: df.ix['a']                                                                                                                                                                                          
/Users/gn/anaconda3/bin/ipython:1: DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
  #!/Users/gn/anaconda3/bin/python
Out[55]: 
year           2011
num             1.4
location    beijing
shit            NaN
Name: a, dtype: object

このixメソッドはまだ使えますが、推奨されています.locと.iloc、この2つの方法を見てみましょう
In [56]: df.loc['a']                                                                                                                                                                                         
Out[56]: 
year           2011
num             1.4
location    beijing
shit            NaN
Name: a, dtype: object

これは上のixと同じで、インデックス名で値を取り、取り出されたSeriesのインデックスも設定されていますが、便利ではないでしょうか.
上のお勧めをもう一度見てください.iloc
In [57]: df.iloc[1]                                                                                                                                                                                          
Out[57]: 
year         2013
num           1.8
location    hebei
shit          NaN
Name: b, dtype: object

In [58]: df.iloc[:2]                                                                                                                                                                                         
Out[58]: 
   year  num location shit
a  2011  1.4  beijing  NaN
b  2013  1.8    hebei  NaN

これですか.ilocはリストのスライスに似ている.ilocの値はインデックス名ではなく、その順序でスライスされた値です.この2つの方法はここで簡単に紹介するだけで、後で自分で言います.
以前、私たちのDataFrameにはすべての値がNAだったので、この列に値を割り当てることができました.
In [61]: df['shit']=10.1                                                                                                                                                                                     

In [62]: df                                                                                                                                                                                                  
Out[62]: 
   year  num  location  shit
a  2011  1.4   beijing  10.1
b  2013  1.8     hebei  10.1
c  2019 -2.1   tianjin  10.1
d  1998  3.6  shandong  10.1

このようにしてSeriesを直接転送することもできます
In [64]: df['shit'] = np.arange(4)                                                                                                                                                                           

In [65]: df                                                                                                                                                                                                  
Out[65]: 
   year  num  location  shit
a  2011  1.4   beijing     0
b  2013  1.8     hebei     1
c  2019 -2.1   tianjin     2
d  1998  3.6  shandong     3

リストに転送することもできます
In [66]: df['shit'] = [3,2,1,1]                                                                                                                                                                              

In [67]: df                                                                                                                                                                                                  
Out[67]: 
   year  num  location  shit
a  2011  1.4   beijing     3
b  2013  1.8     hebei     2
c  2019 -2.1   tianjin     1
d  1998  3.6  shandong     1

入力された値がSeriesの場合、indexに従って一致します.
In [68]: df['shit'] = pd.Series([1,2,3,4],index=['d','c','b','a',])                                                                                                                                          

In [69]: df                                                                                                                                                                                                  
Out[69]: 
   year  num  location  shit
a  2011  1.4   beijing     4
b  2013  1.8     hebei     3
c  2019 -2.1   tianjin     2
d  1998  3.6  shandong     1

辞書を直接伝えてもいいですか?
In [70]: df['shit'] = {'a':1.1,'b':2.2,'c':3.3,'d':4.4}                                                                                                                                                      

In [71]: df                                                                                                                                                                                                  
Out[71]: 
   year  num  location shit
a  2011  1.4   beijing    a
b  2013  1.8     hebei    b
c  2019 -2.1   tianjin    c
d  1998  3.6  shandong    d

Emm、だめだと思います.みんなは自分でやってもいいですが、いくつかの前提があります.長さはDataFrameの長さと一致しなければならない(多くなれば誤報が少なくてもよい).リストは辞書でいいが、キーを割り当てるしかない.割り当てられたSeries長がDataFrameよりも少ない場合、欠落した値はNAです.
Seriesの長さがDataFrameより少ない場合を見てみましょう
In [74]: df                                                                                                                                                                                                  
Out[74]: 
   year  num  location  shit
a  2011  1.4   beijing   NaN
b  2013  1.8     hebei   3.0
c  2019 -2.1   tianjin   2.0
d  1998  3.6  shandong   1.0

全体的にDataFrameに値を付けるのは便利です.
視野を広げるためにDataFrameに値を付けてもいいです
In [75]: df['new'] = df['year'] > 2000                                                                                                                                                                       

In [76]: df                                                                                                                                                                                                  
Out[76]: 
   year  num  location  shit    new
a  2011  1.4   beijing   NaN   True
b  2013  1.8     hebei   3.0   True
c  2019 -2.1   tianjin   2.0   True
d  1998  3.6  shandong   1.0  False

意味は私が“new”という新しい列を作成したので、この列のデータはdf[‘year’]>2000で、明らかに後でこれはブール値(DataFrameはもちろんブール値を保存することができます)で、意味はyearが2000より大きいかどうか、Trueを返すより大きいかどうか、Falseを返すより小さいかどうかです.では選別してみましょう
In [77]: df[df['new'] == True]                                                                                                                                                                               
Out[77]: 
   year  num location  shit   new
a  2011  1.4  beijing   NaN  True
b  2013  1.8    hebei   3.0  True
c  2019 -2.1  tianjin   2.0  True

DataFrameの修正については、実際には正しい使い方や間違った使い方の詳細がたくさんあります.DataFrameは英語が下手でも影響しません.コードを見ればいいのです.この節では、DataFrameを作成する方法、修正する方法について主に説明します.ついでに、スライスと値を取ることを簡単に学びました.その後はDataFrameのインデックスオブジェクトで、知識点も多く雑多です.とにかく頑張りましょう