製薬企業研究者がPandasについてまとめてみた

# はじめに

Pandasは、表形式のデータを簡単に扱えるライブラリです。
ここでは、Pandasに関して最低限知っておきたいポイントに絞って解説します。
Python3系の使用を想定しています。


# ライブラリの読み込み

`import`を使ってライブラリを読み込むことができます。
慣習的に、`pd`と省略して呼び出せるようにすることが多いです。

```python:Pandas_1.py
import pandas as pd
```

# Series

Seriesは辞書型のリストのようなデータです。

## Seriesの作成

```python:Pandas_2.py
import pandas as pd


series_olympic = pd.Series({'東京': 2020, 'リオデジャネイロ': 2016, 'ロンドン': 2012})
print(series_olympic)
```

## Seriesの参照

```python:Pandas_3.py
import pandas as pd


series_olympic = pd.Series({'東京': 2020, 'リオデジャネイロ': 2016, 'ロンドン': 2012})

print(series_olympic[0:2])
print(series_olympic.index) # インデックスのみを取り出す。
print(series_olympic.values) # 値のみを取り出す。

print(series_olympic[series_olympic % 8 == 0]) # 条件を満たす要素のみを取り出す。
```


## 要素の追加・削除

```python:Pandas_4.py
import pandas as pd


series_olympic = pd.Series({'東京': 2020, 'リオデジャネイロ': 2016, 'ロンドン': 2012})

series_olympic = series_olympic.append(pd.Series({'北京': 2008})) # 新たな要素を追加する。
print(series_olympic)

series_olympic = series_olympic.drop('東京') # 要素を削除する。
print(series_olympic)
```

## Seriesのソート

```python:Pandas_5.py
import pandas as pd


series_olympic = pd.Series({'東京': 2020, 'リオデジャネイロ': 2016, 'ロンドン': 2012})

print(series_olympic.sort_index()) # インデックスの昇順にソートする。
print(series_olympic.sort_values()) # 値の昇順にソートする。
print(series_olympic.sort_values(ascending=False)) # 値の降順にソートする。
```


# DataFrame

DataFrameは、Seriesを結合した表形式のデータです。

## DataFrameの作成

```python:Pandas_6.py
import pandas as pd


series_name = pd.Series(['Ichiro', 'Jiro', 'Saburo'])
series_height = pd.Series([200, 173, 141])
series_weight = pd.Series([100, 72, 40])

df_humans = pd.DataFrame({'name': series_name, 'height': series_height, 'weight': series_weight})
print(df_humans)

df_humans.index = ['一郎', '二郎', '三郎'] # 行名をつける。
df_humans.columns = ['名前', '身長', '体重'] # 列名をつける。
print(df_humans)

df_humans_empty = pd.DataFrame(columns=['名前', '身長', '体重']) # 指定した列名の空のDataFrameを作成する。
print(df_humans_empty)
```

## DataFrameの参照

```python:Pandas_7.py
import pandas as pd


series_name = pd.Series(['Ichiro', 'Jiro', 'Saburo', 'Siro'])
series_height = pd.Series([200, 173, 141, 172])
series_weight = pd.Series([100, 72, 40, 72])
series_gender = pd.Series(['男', '男', '女', '男'])
series_bmi = pd.Series([25, 24, 20, 24.9])
df_humans = pd.DataFrame({'name': series_name, 'height': series_height, 'weight': series_weight}, 'gender': series_gender, 'bmi': series_bmi)
df_humans.index = ['一郎', '二郎', '三郎', '四郎']
df_humans.columns = ['名前', '身長', '体重', '性別', 'BMI']

print(df_humans['名前']) # 「名前」の列を取り出す。
print(df_humans.名前) # これでも「名前」の列を取り出せる。

print(df_humans.loc['一郎', '体重']) # 行名、列名を指定して抽出する。
print(df_humans.loc[['一郎', '二郎'], ['身長', '体重', 'BMI']]) # 複数行、複数列を指定することもできる。
print(df_humans.loc['二郎']) # 指定した行全体を抽出する。
print(df_humans.loc[:, 'BMI']) # 指定した列全体を抽出する。

print(df_humans.iloc[0, 2]) # 行のインデックス番号、列のインデックス番号を指定して抽出する。
print(df_humans.iloc[[0, 1], [1, 2, 4]]) # 複数行、複数列を指定することもできる。
print(df_humans.iloc[1]) # 指定した行全体を抽出する。
print(df_humans.iloc[:, 4]) # 指定した列全体を抽出する。

print(df_humans[df_humans['BMI'] >= 25]) # 条件を満たす行のみを抽出する。
print(df_humans[(df_humans['身長'] >= 170) & (df_humans['体重'] >= 70)]) # 複数条件 (and) でも可能。
print(df_humans[(df_humans['体重'] < 70) | (df_humans['BMI'] < 25)]) # 複数条件 (or) でも可能。
print(df_humans[df_humans['BMI'] < 25]['名前']) #条件を満たす行をフィルターして列を指定することも可能。
```

## DataFrameのソート

```python:Pandas_8.py
import pandas as pd


series_name = pd.Series(['Ichiro', 'Jiro', 'Saburo', 'Siro'])
series_height = pd.Series([200, 173, 141, 172])
series_weight = pd.Series([100, 72, 40, 72])
series_gender = pd.Series(['男', '男', '女', '男'])
series_bmi = pd.Series([25, 24, 20, 24.9])
df_humans = pd.DataFrame({'name': series_name, 'height': series_height, 'weight': series_weight}, 'gender': series_gender, 'bmi': series_bmi)
df_humans.index = ['一郎', '二郎', '三郎', '四郎']
df_humans.columns = ['名前', '身長', '体重', '性別', 'BMI']

df_humans = df_humans.sort_values(by='体重') # 体重で昇順にソートする。
print(df_humans)
df_humans = df_humans.sort_values(by='体重', ascending=False) # 体重で降順にソートする。
print(df_humans)
df_humans = df_humans.sort_values(by=['体重', 'BMI']) # 体重、BMIで昇順にソートする。
print(df_humans)
```

## 行または列の追加・削除

```python:Pandas_9.py
import pandas as pd


series_name = pd.Series(['Ichiro', 'Jiro', 'Saburo'])
series_height = pd.Series([200, 173, 141])
series_weight = pd.Series([100, 72, 40])

df_humans = pd.DataFrame({'name': series_name, 'height': series_height, 'weight': series_weight})
df_humans.index = ['一郎', '二郎', '三郎']
df_humans.columns = ['名前', '身長', '体重']

df_humans['性別'] = ['男', '男', '女'] # 列を追加する。
df_humans['BMI'] = df_humans['体重'] / ((df_humans['身長']  / 100)** 2) # 列同士で計算した結果を追加することも可能。
print(df_humans)

df_humans.loc['四郎'] = ['Siro', 170, 72, '男', 24.9] # 行を追加する。
print(df_humans)

df_humans_2 = df_humans.drop('三郎') # 行を削除する。
print(df_humans_2)
df_humans_3 = df_humans.drop('性別', axis=1) # 列を削除する。
print(df_humans_3)
```

## 外部ファイルの読み込み・書き出し

```python:Pandas_10.py
import pandas as pd


df_csv = pd.read_csv('filepath/filename.csv') # CSVファイルを読み込む。
df_text = pd.read_csv('filepath/filename.txt', sep='¥t') # タブ区切りテキストファイルを読み込む。
df_excel = pd.read_excel('filepath/filename.xlsx') # エクセルファイルを読み込む。

df_csv_2 = pd.read_csv('filepath/filename_2.csv', header=1) # 1行目が空白になっていたりして、2行目を列名にしたい場合。
df_csv_3 = pd.read_csv('filepath/filename_3.csv', header=None) # 列名がない場合。

df_excel_sheet2 = pd.read_excel('filepath/filename.xlsx', sheet_name=1) # シートのインデックス番号（0始まり）を指定する。
df_excel_sheet2 = pd.read_excel('filepath/filename.xlsx', sheet_name='sheet2') # シート名を指定する。


df_csv.to_csv('filepath/filename.csv') # CSVファイルを書き出す。
df_text.to_csv('filepath/filename.txt', sep='¥t') # タブ区切りテキストファイルを書き出す。
df_excel.to_excel('filepath/filename.xlsx') # エクセルファイルを書き出す。

df_csv.to_csv('filepath/filename.csv', index=False) # 一番左の列に入るインデックス番号が不要な場合。
```


# まとめ

ここでは、Pandasの基本について紹介しました。
これらが全部できるようになると、外部ファイルを読み込んで、処理をして、ファイルを書き出すということができるようになります。


# 参考資料・リンク

[プログラミング言語Pythonとは？AIや機械学習に使える？](https://pharma-engineer.com/basic-programming/python-summary/)