はじめに
この記事は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()