松尾研のDeep Learning基礎講座演習コンテンツをやってみた(Chap.2-Pandas)

Panda?
なんですかそれは……
説明をみるとどうやらＲみたいな感じと考えればいいのかなーと思いつつ開始。

#準備
恒例のimport
Seriesは配列のようなオブジェクトなんですって……（？）


```
from pandas import Series,DataFrame
import pandas as pd
```

#Series

```
sample_pd_data=pd.Series([0,1,2,3,4,5,6,7,8,9])
print(sample_pd_data)
```

出力

```
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
dtype: int64
```

2列表示……？要素のデータ型も表示してくれるのね。

```
#データの値
print(sample_pd_data.value)
#index
print(sample_pd_data.index)
```

出力

```
データの値: [0 1 2 3 4 5 6 7 8 9]
インデックスの値: RangeIndex(start=0, stop=10, step=1)
```

seriesそのものとvalueとでは異なるものなんですね。

```
sample_pd_index_data=pd.Series([0,1,2,3,4,5,6,7,8,9],index=['a','b','c','d','e','f','g','h','i','j'])
print(sample_pd_index_data)
```

出力

```
a    0
b    1
c    2
d    3
e    4
f    5
g    6
h    7
i    8
j    9
dtype: int64
```

あーなるほど。
<font color='Blue'>2列だと思ったの、左側はindexだったんですね。</font>
こうするとindexも任意にできる……と。
indexが足りなかったりするとエラーになるから注意。

#DataFrame
各列で異なる型を持てるらしい。

```
attri_data1={'ID':['100','101','102','103','104'],
'citi':['Tokyo','Osaka','Kyoto','Hokkaido','Tokyo'],
'birth_year':[1990,1989,1992,1997,1982],
'name':['Hiroshi','Akiko','Yuki','Satoru','Steeve']}
attri_data_frame1=DataFrame(attri_data1)
print(attri_data_frame1)
```

出力

```
attri_data1={'ID':['100','101','102','103','104'],
'city':['Tokyo','Osaka','Kyoto','Hokkaido','Tokyo'],
'birth_year':[1990,1989,1992,1997,1982],
'name':['Hiroshi','Akiko','Yuki','Satoru','Steeve']}

#DataFrame
attri_data_frame1=DataFrame(attri_fata1)
print(attri_data_frame1)
```

よくわからないけどDataFrame()にcbindみを感じる……。　~~うーん、自信ないから言及すんのやめとくわ……。~~

Series同様、indexを更新してみましょう

```
attri_data_frame_index1=DataFrame(attri_data1,index=['a','b','c','d','e',])
print(attri_data_frame_index1)
```

出力

```
    ID  birth_year       city     name
a  100        1990      Tokyo  Hiroshi
b  101        1989      Osaka    Akiko
c  102        1992      Kyoto     Yuki
d  103        1997  Hokkaidao   Satoru
e  104        1982      Tokyo   Steeve
```

#転置

行列ではおなじみの操作が手軽にできるらしい

```
attri_data_frame1.T
```

できれいな表が出力できる。

#列指定
列指定にはデータの後にカラム名(？)をつける

```
#複数指定はリスト
attri_data_frame1[['ID','birth_year']]
```

出力

```

    ID birth_year
0	100	  1990
1	101	  1989
2	102	  1992
3	103	  1997
4	104	  1982
```

条件指定も

```
attri_data_frame1[attri_data_frame1['city']=='Tokyo']
```

```
#複数の条件指定(.isin())
attri_data_frame1[attri_data_frame1['city'].isin(['Tokyo','Osaka'])]
```
<details><summary>やってみた</summary>
```
attri_data_frame1[attri_data_frame1['birth_year']<=1990]
```
出力
```
ID	birth_year	city	name
0	100	1990	Tokyo	Hiroshi
1	101	1989	Osaka	Akiko
4	104	1982	Tokyo	Steeve
```
</details>


#削除

```
#.drop([],axis=)で削除
#axis=1で列削除
attri_data_frame1.drop(['birth_year'],axis=1)

#axis=0で行削除
attri_data_frame1.drop([0],axis=0)
```

#結合&集計

```
#とりあえず2個目のdataframeは作ったとする
#pd.merge()で結合 
pd.merge(attri_data_frame1,attri_data_frame2)

#groupby(A)[B]でAを軸にＢを集計
attri_data_frame2.groupby("sex")["math"].mean
```

mean()の部分を変えれば種々の基本統計量も出せる

```
attri_data_frame2.groupby("sex")["math"].min()
attri_data_frame2.groupby("sex")["math"].max()
attri_data_frame2.groupby("sex")["math"].median()
```

#ソート

```
#.sort_index()でindexによる昇順ソート
#.sort_values()で値による昇順ソート
```
<font color="HotPink">(ascending=False)で降順ソートだ！！</font>

#その他

```
#.isin([])で存在確認
True or False で返事

#dataframe.(列名)=np.nan
列をnullにしちゃう

#.isnull()でその判別したり
こっちもTrue or False で返事

#.isnull().sum()でnullの数を数える……
　…………なぜ？
```


#練習問題

<details><summary>問題1</summary>
```
from pandas import Series,DataFrame
import pandas as pd
attri_data1 = {'ID':['1','2','3','4','5']
        ,'sex':['F','F','M','M','F']
        ,'Money':[1000,2000,500,300,700]
        ,'name':['Saito','Horie','Kondo','Kawada','Matsubara']}
attri_data_frame1 = DataFrame(attri_data1)
attri_data_frame1[attri_data_frame1['Money']>=500]
```
</details>


<details><summary>問題2</summary>
```
※meanに()を忘れない
attri_data_frame1.groupby('sex')['Money'].mean()
```
</details>


<details><summary>問題3</summary>
```
attri_data2 = {'ID':['3','4','7']
        ,'Math':[60,30,40]
        ,'English':[80,20,30]}
attri_data_frame2 = DataFrame(attri_data2)
pd.merge(attri_data_frame1,attri_data_frame2,on='ID',how='outer')
on=''で列名指定
how=''で結合の仕方を指定します
how:2つのdataframeについては
inner:両方に存在するデータのみ残す
left:1←2,１のデータはみんな残る
right:1→2,2のデータはみんな残る
outer:1+2,両方みんな残す。たぶんindexで並ぶ
```
</details>

これ単体でつかうものではないでしょうから変なこといいますけど、これだけだとあんまりどう使うかわかんないよね。でもソートとか条件指定とかgroupbyとかけっこうｲｲｶﾝｼﾞだよね。

あとSeriesはexcelの縦列みたいなものだと思っとこう。


>一応、ちょこちょこ変えてるんですけど、やっぱ怖みなので今後は徐々に写経は減らします……。