pandasでよく使う処理メモ（初心者）

# はじめに
この記事はpandasを使ったpythonによるデータ分析のメモ書きです。
初歩的なことを簡潔に記載します。
pandasで読み込んだデータを代入した変数は以下とし、記載します。

 * an_data

# pandasとは
　Pythonのデータ解析用ライブラリ

# pandasのimport
import例（以降、pdにて利用例を記載)

```
import pandas as pd
```


# CSVファイル、Excelファイル読み込み


 * CSVファイルの読み込み

```
an_data = pd.read_csv("<CSVファイル名>")
```

 * Excelファイルの読み込み

```
an_data = pd.read_excel("<エクセルファイル名>")
```


# 読み込んだデータを5行分表示
　データに含まれる内容を確認したいときに便利

```
an_data.head()
```


# データ結合
　別々に読み込んだデータを結合する場合の処理について記載。
　一つ目のデータ名：an_data1
　二つ目のデータ名：an_data2

### ユニオン
　データを縦に結合します。(ignore_index=Trueにしておくとindexを再度振り直してくれる)

```
concat_data = pd.concat([an_data1, an_data2], ignore_index=True)
```


### ジョイン
　データを横に結合します。

```
merge_data = pd.merge(an_data1, an_data2[[<特定のキーを結合する>]], on="<結合キー>", how=left)
```


# 日付データの取り扱い方

　文字列認識されたデータを日付データに変更

```
an_data["date"] = pd.to_datetime(an_data["date"])
```

　年と月のみを抽出

```
an_data["年月"] = an_data["date"].dt.strftime("%Y%m")
```

　エクセルなどのデータで以下表記のようになっているものは、謎数字が読み込まれる。
　謎数字を日付データとして取り扱えるようにする。

 - 謎数字になるような元データ
    - 2020年5月1日
 - 上記データをpd.to_datetime()すると、以下のような数字が出力される(例なので実際の値とは違います)
    - 456789

```
ch_time = pd.to_timedelta(an_data.loc[flg_num, "date"].astype("float"), unit="D") + pd.to_datetime("1900/01/01")
```

　一個上の処理をすると、YYYY-MM-DDのようなハイフン区切りになる。
　スラッシュ区切りの日付と混じっていたら面倒なので、書式統一(YYYY-MM-DD)する。


```
ch_time = pd.to_datetime(an_data.loc[~flg_num, "date"])
```



# データ無しの値を探す

　nullデータが含まれているindexの加算

```
an_data.isnull().sum()
```

　nullデータが含まれているかbooleanで出力 (axisが0で縦方向。1で横方向)

```
an_data.isnull().any(axis=0)
```


# describeによるデータの出力
　データの数、平均、標準偏差、五数要約が出力される

```
an_data.describe()
```


# データタイプの出力

```
<読み込みデータ>.dtypes
```



# groupbyによるデータまとめの例
　as_index=Falseオプションをつけると、groupbyで指定の名前で自動作成されるindexを作成しない。


* 特定の列が持つ同じ値でグループ化し、別の列の数値を加算する

```
an_data.groupby(["<特定の列>"]).sum()["<別の列>"]
```

　特定の列と別の列は複数指定することが可能。

```
an_data.groupby(["<特定の列A>", "<特定の列B>"]).sum()["<別の列A">, "<別の列b>"]
```

* 特定の列が持つ同じ値でグループ化し、別の列の値をカウントする。

```
tmp = an_data.groupby(["<特定の列>"]).count()["<別の列>"]
```

* groupbyとaggregation

　aggを使うことで平均などを出力できる

```
tmp = an_data.groupby("<特定の列>").agg("mean", "median", "max", "min")["<aggregationしたい列>"]
```


# pivot_table

　新しい表を作成する

```
an_data = pd.pivot_table(an_data, index="<indexにしたい列名>", columns"<olumnにしたい列名>", values=["<表に出力したい列の値>"], aggfunc="", fill_value=0
```


# ソート
ascending=Trueは昇順

```
an_data.sort_values(by=["<主となるソート対象列>"], ascending=True)
```


# 空白削除

```
an_data["test_val"] = an_data["test_val"].str.replace("  ", "")
an_data["test_val"] = an_data["test_val"].str.replace(" ", "")
```


# uniqueによるデータの確認

```
print(len(pd.unique(an_data["val"])))
print(pd.unique(an_data["val"]))
```


# 値が数値であるパラメータ数の確認

```
flg_num = an_data["<列名>"].astype("str").str.isdigit()
flg_num.sum()
```


# loc
　ラベル指定

 * ラベルで指定

```
an_data.loc[:, [<column01>, <column02>]]
```

 * booleanで指定

```
an_data.loc[[True, False, True, False], [False, False, True]]
```


# iloc
　番号指定

* 番号で指定

```
an_data.iloc[[0:2], [2:4]]
```

* booleanで指定

```
an_data.iloc[[False, True, True], [False, True, False]]
```



# ラベルの名前変更
　inplace=Trueを指定すること、元のデータが変更される

```
an_data.rename(columns={"<変更前の名前>":"<変更後の名前>"}, index={"<変更前の名前>":"<変更後の名前>"}, inplace=True)
```


# 再index化
　index値の再振り直しをするのでindexの被りがなくなる。

```
an_data = an_data.reset_index(drop=False)
```

# ドロップ処理

```
an_data = an_data.drop("<ドロップしたい項目>", axis=1)
```


# where
　whereを使って条件に合致”しない”項目の値を変更
　以下例は<比較項目>の値が5以下でない場合に、<対象の項目>の値を1に変更する

```
an_data["<対象の項目>"] = an_data["<対象の項目>"].where(an_data["<比較項目>"]<5, 1)
```


# relativedelta

```
delta = relative_delta(dtime1, dtime2)
deltaの中身はdtime1とdtime2の差分（dtime1の方が最新の日付)
```

# 欠損値の除去

```
an_data = an_data.dropna(subsent=["<欠損値が存在する列名>"])
```

欠損箇所の置き換えは以下 (0で埋める)

```
an_data = an_data.fillna(0)
```

確認は以下で可能

```
an_data.isna().sum()
```

# csv出力

```
an_data.to_csv("", index=False)
```


# graph出力の例

　graph出力用ライブラリのimport例 （以降、pltにて利用例を記載)
　併せて2行目にjupyter notebookで使う場合の例を記載する。

```
import matplotlib.pyplot as plt
%matplotlib inline
```

　プロットするデータの読み込み（横軸、縦軸、オプションの順番で記載）
　最低限labelはつけた方がいい

```
plt.plot(an_data.index, an_data['<縦軸となる項目>'], label='label-1')
plt.plot(an_data.index, an_data['<縦軸となる項目>'], label='label-2')
plt.plot(an_data.index, an_data['<縦軸となる項目>'], label='label-3')
```

　読み込んだデータをグラフにプロットする

```
plt.legend()
```