[Python] pandasの使い方まとめ

pandasによるデータ処理メモ
pandasに関する情報ページはわりと豊富なので、主にリンクのまとめです。

# 実行環境

実行環境は、Jupyter(IPython) Notebook を使うのが良いと思います。

[Windowsにpython3とJupyter Notebook(旧: ipython notebook)をインストールする - Qiita](http://qiita.com/koara-local/items/8d48d0306c85c61aed97)

# pandasのインストールとインポート

```bash
$ pip install pandas
```

```python
import pandas as pd
```

# DataFrameの作成
## データの新規作成

`pd.DataFrame` で DataFrame の作成ができる。注意点として、各列ごとのデータ数は一致している必要がある。

```py3:DataFrameの作成
df = pd.DataFrame({
        'A' : [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 8, 9, 10],
        'B' : [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8]
    })
```

## 既存データの読み込み
### CSV, TSV を開く

```py:データを読み込んでDataFrameの作成
# CSV
csv_data  = pd.read_csv('./path/to/hoge.csv')

# TSV
tsv_data  = pd.read_csv('./path/to/hoge.csv', delimiter='\t')
```

[pandasでcsv/tsvファイルの読み書き | mwSoft](http://www.mwsoft.jp/programming/numpy/pandas_csv.html)
[pandasでカラムサイズが一定でないcsv/tsvを読み込む : mwSoft blog](http://blog.mwsoft.jp/article/113600124.html)
[Pythonコーディング備忘録　～その３～（pandasのread_csvを使いこなす） - 自調自考の旅](http://rosyuku.hatenablog.com/entry/2015/09/03/002203)

# データを抽出する

[Python pandas データ選択処理をちょっと詳しく <前編> - StatsFragments](http://sinhrks.hatenablog.com/entry/2014/11/12/233216)
[Python pandas データ選択処理をちょっと詳しく <中編> - StatsFragments](http://sinhrks.hatenablog.com/entry/2014/11/15/230705)
[Python pandas データ選択処理をちょっと詳しく <後編> - StatsFragments](http://sinhrks.hatenablog.com/entry/2014/11/18/003204)
[Pandasでデータフレームを条件指定で参照する - Qiita](http://qiita.com/wwacky/items/095bcac7cc450dc3232a)

## 列(column)抽出
### ラベル名から抽出カラムの指定
```python
data = data[['column1', 'column2']]
```
## 行(row)抽出
### 条件を指定して抽出
```python
data = data[data.column1 == 'hoge']
```

### 正規表現での検索による抽出
```python
data = data[data.column1.str.contains(regex)]
```
[Python pandas：正規表現を使いDataFrameを検索 - Qiita](http://qiita.com/irs/items/4ebbfd8bef63db1892fb)
[<Python, pandas> データフレーム文字列検索 - ねこゆきのメモ](http://nekoyukimmm.hatenablog.com/entry/2015/11/19/164317)

### 欠測値(NaN)の除去
```py3:欠測値の一つでも存在する行を除去
df = df.dropna()
```

```py3:項目を指定
df = df.dropna(subset=['項目1', '項目2'])
```

# DataFrameの結合

[Python pandas 図でみる データ連結 / 結合処理 - StatsFragments](http://sinhrks.hatenablog.com/entry/2015/01/28/073327)
[Merge, join, and concatenate — pandas 0.18.1 documentation](http://pandas.pydata.org/pandas-docs/stable/merging.html)

# DataFrameの加工
## データのソート
### 数値でのソート

```py:データのソート
# １種類の場合
df = df.sort_values(['データ種別'])

# 1 -> 2の順で昇順にソート
df = df.sort_values(['データ種別1', 'データ種別2'])
```
[pandas.DataFrame.sort_values — pandas 0.18.1 documentation](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values.html)
[pandas でソート - Qiita](http://qiita.com/y_sk71/items/c22f47bd4ddc1dc46dc8)

## 行/列名の変更

```py
df.rename(columns={'A': 'a'}, index={'ONE': 'one'}, inplace=True)
```

[pandas.DataFrame.rename — pandas 0.18.1 documentation](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html)
[pandas DataFrameの行名・列名の変更 | nkmk log](http://nkmk.github.io/blog/python-pandas-dataframe-rename/)

## 現在のデータ順でindexの振り直し
```py
df = df.reset_index(drop=True)
```

[python - How to reset index in a pandas data frame? - Stack Overflow](http://stackoverflow.com/questions/20490274/how-to-reset-index-in-a-pandas-data-frame)
[pandas.DataFrame.reset_index — pandas 0.18.1 documentation](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reset_index.html)

## データの型の変更

```py3:浮動小数点型として扱う
df = df.astype(float)
```

## 行列の反転

```py3:行列の反転
df = df.T
```

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/b984f10e-e81d-9d75-1326-df8519176a0b.png)

# DataFrameから別形式への変換
## DataFrame から List への変換
```py
df.values.tolist()
```

[python - Pandas DataFrame to list - Stack Overflow](http://stackoverflow.com/questions/23748995/pandas-dataframe-to-list)

## CSV, TSV での書き出し

```py
# CSV
data.to_csv('./path/to/output.csv')

# TSV
data.to_csv('./path/to/output.csv', sep='\t')
```

[pandasでcsv/tsvファイルの読み書き | mwSoft](http://www.mwsoft.jp/programming/numpy/pandas_csv.html)

# pandas <=> DB 間連携
## Microsoft Access (mdb)
[[Linux][Python][Pandas] Microsoft Accessのデータベース(*.mdb)をPandasで読み込む - Qiita](http://qiita.com/koara-local/items/ae48162d848872cc29fd)

# データプロット/グラフ出力
## pandas での `plot` の基本仕様
pandasは `matplotlib` を薄くラップしています。ある程度のグラフまでは pandas の `plot` で出力可能です。
pandasでのグラフの出力方法の基本については以下などを参照してください。

[Visualization — pandas 0.18.1 documentation](http://pandas.pydata.org/pandas-docs/stable/visualization.html)

## pandas の `plot` をもう少し操作
[Python pandas プロット機能を使いこなす - StatsFragments](http://sinhrks.hatenablog.com/entry/2015/11/15/222543)
[PythonでPandasのPlot機能を使えばデータ加工からグラフ作成までマジでシームレス - Qiita](http://qiita.com/hik0107/items/de5785f680096df93efa#_reference-6cecf4dcdb237cea8974)

# 欠損値/外れ値/離散化の処理

[Python pandas 欠損値/外れ値/離散化の処理 - StatsFragments](http://sinhrks.hatenablog.com/entry/2016/02/01/080859)

# パフォーマンスについて

[Python pandas パフォーマンス維持のための 3 つの TIPS - StatsFragments](http://sinhrks.hatenablog.com/entry/2015/07/11/223124)

# 書籍

pandasの作者による解説本
[O'Reilly Japan - Pythonによるデータ分析入門](https://www.oreilly.co.jp/books/9784873116556/)

# 参考(Pandasについて)
+ [Pandasを用いた基礎分析 - Platinum Data Blog by BrainPad](http://blog.brainpad.co.jp/entry/2014/12/10/204111)
+ [pandasでよく使う文法まとめ - Qiita](http://qiita.com/okadate/items/7b9620a5e64b4e906c42)

# 参考(データ処理について)
+ [整然データとは何か｜Colorless Green Ideas](http://id.fnshr.info/2017/01/09/tidy-data-intro/)