pandas入門

## pandasの基本トピック
### pandasの概要
`pandas`はデータ分析やデータの操作に用いることのできる`Python`から用いることのできるオープンソースのライブラリです。統計解析に用いられる`R`と似たような機能を用いることができます。

https://pandas.pydata.org/


### pandasのインストールと動作確認
```
$ pip install pandas
```

`pandas`は上記を実行することでPyPIから入手することができます。

https://pandas.pydata.org/docs/getting_started/install.html

`pandas`の動作確認にあたっては下記などを実行すると良いです。

```python
import pandas as pd

df1 = pd.DataFrame({'A': [1, 2, 3]})
df2 = pd.DataFrame({'A1': [1, 2, 3], 'A2': [1, 2, 3]})

print(d1)
print(d2)
```

・実行結果
```
   A
0  1
1  2
2  3
   A1  A2
0   1   1
1   2   2
2   3   3
```


## 実務でよく用いるpandasの機能
### csvファイルの保存・読み込み
```python
import pandas as pd

df = pd.DataFrame({'A1': [0.1, 0.2, 0.3], 'A2': [1, 2, 3]})

df.to_csv("sample1.csv")
```

上記を実行すると、下記のようなcsvファイルがカレントディレクトリに生成されます。

```csv:sample1.csv
,A1,A2
0,0.1,1
1,0.2,2
2,0.3,3
```

上記の一番左のインデックスを省略したい場合は下記のように`index`に`False`を指定すれば良いです。

```python
import pandas as pd

df = pd.DataFrame({'A1': [0.1, 0.2, 0.3], 'A2': [1, 2, 3]})

df.to_csv("sample2.csv", index=False)
```

上記を実行すると下記のようなcsvファイルがカレントディレクトリに生成されます。

```csv:sample2.csv
A1,A2
0.1,1
0.2,2
0.3,3
```

次にcsvファイルの読み込みについて確認します。

```python
import pandas as pd

df = pd.read_csv("sample2.csv")

print(df)
```

・実行結果
```
    A1  A2
0  0.1   1
1  0.2   2
2  0.3   3
```

上記のように`read_csv`メソッドを用いることでcsvファイルの読み込みを行うことができます。


### カラムの追加
`pandas`では辞書型に似たような表記に基づいてカラムの追加を行うことができます。カラムの追加はたとえば下記を実行することで行うことができます。

```python
import pandas as pd

df1 = pd.read_csv("sample2.csv")
df2 = pd.read_csv("sample2.csv")
df2["A3"] = df2["A2"]**2

print(df1)
print(df2)
```

・実行結果
```
    A1  A2
0  0.1   1
1  0.2   2
2  0.3   3
    A1  A2  A3
0  0.1   1   1
1  0.2   2   4
2  0.3   3   9
```


### ソート
`pandas`でソートを実装するにあたっては`pandas.DataFrame.sort_values()`や`pandas.DataFrame.sort_index()`を用いれば良いです。まず`pandas.DataFrame.sort_values()`について確認します。

```python
import pandas as pd

df1 = pd.DataFrame({'A1': [1, 2, 3, 4, 5], 'A2': [1, -2, 3, -4, 5]})

print(df1)
df2 = df1.sort_values('A2')
print(df2)
df3 = df2.sort_values('A1')
print(df3)
```

・実行結果
```
   A1  A2
0   1   1
1   2  -2
2   3   3
3   4  -4
4   5   5
   A1  A2
3   4  -4
1   2  -2
0   1   1
2   3   3
4   5   5
   A1  A2
0   1   1
1   2  -2
2   3   3
3   4  -4
4   5   5
```

上記より`sort_values`メソッドにカラム名を引数に与えることで対応するカラムの値に基づいてソートを行うことができます。デフォルトでは`sort_values`メソッドは昇順でソートされますが、降順でソートする場合は下記のように`ascending=False`を指定すれば良いです。

```python
import pandas as pd

df1 = pd.DataFrame({'A1': [1, 2, 3, 4, 5], 'A2': [1, -2, 3, -4, 5]})

print(df1)
df2 = df1.sort_values('A2', ascending=False)
print(df2)
df3 = df2.sort_values('A1', ascending=False)
print(df3)
```

・実行結果
```
   A1  A2
0   1   1
1   2  -2
2   3   3
3   4  -4
4   5   5
   A1  A2
4   5   5
2   3   3
0   1   1
1   2  -2
3   4  -4
   A1  A2
4   5   5
3   4  -4
2   3   3
1   2  -2
0   1   1
```

`sort_values`メソッドと同様に`sort_index`メソッドは下記のように実行することができます。
```python
import pandas as pd

df1 = pd.DataFrame({'A1': [1, 2, 1, 2, 1], 'A2': [1, -2, 3, -4, 5]})

print(df1)
df2 = df1.sort_values('A1')
print(df2)
df3 = df2.sort_index()
print(df3)
```
・実行結果
```
   A1  A2
0   1   1
1   2  -2
2   1   3
3   2  -4
4   1   5
   A1  A2
0   1   1
2   1   3
4   1   5
1   2  -2
3   2  -4
   A1  A2
4   1   5
3   2  -4
2   1   3
1   2  -2
0   1   1
```


### SQLのような使い方①(検索)
下記のようなプログラムを実行することで`pandas`で検索を行うことができます。

```python
import pandas as pd

df1 = pd.DataFrame({'A1': [1, 2, 1, 2, 1], 'A2': [1, -2, 3, -4, 5]})

print(df1)
df2 = df1[df1['A1'] == 2]
print(df2)
df3 = df1[(df1['A1'] == 2) & (df1['A2'] == -2)]
print(df3)
```

・実行結果
```
   A1  A2
0   1   1
1   2  -2
2   1   3
3   2  -4
4   1   5
   A1  A2
1   2  -2
3   2  -4
   A1  A2
1   2  -2
```


### SQLのような使い方②(集計)
下記のように`pandas.DataFrame.groupby`を用いることで`pandas`で集計を行うことができます。

```python
import pandas as pd

df1 = pd.DataFrame({'A1': [1, 2, 1, 2, 1], 'A2': [1, -2, 3, -4, 5]})

print(df1)
print(df1.groupby('A1').sum())
print(df1.groupby('A1').count())
print(df1.groupby('A1').mean())
print(df1.groupby('A1').max())
print(df1.groupby('A1').min())
```

・実行結果
```
   A1  A2
0   1   1
1   2  -2
2   1   3
3   2  -4
4   1   5
    A2
A1    
1    9
2   -6
    A2
A1    
1    3
2    2
     A2
A1     
1   3.0
2  -3.0
    A2
A1    
1    5
2   -2
    A2
A1    
1    1
2   -4
```