Pandas 100本ノックの覚書
最近Pandas 100本ノックを始めたので、覚書として色々と書き残したいと思います。
実行環境はGoogle Colabです。
ノック2 データを結合(ユニオン)してみよう 縦方向結合編
- transaction_1
- transaction_2
transaction_1 = pd.read_csv('/content/transaction_1.csv') transaction_2 = pd.read_csv('/content/transaction_2.csv')
読み出したファイルをpd.concatで結合してみる。
オプションのignore_index=Tureでインデックス番号の降り直しをしている。
transaction = pd.concat([transaction_1,transaction_2], ignore_index=True)
結合後確認
len関数で各ファイル数の行数を確認する。
transaction_1が5000行、transaction_2が1786行、transactionは1,2を結合したので6786(5000+1786)となっています。
print(len(transaction_1)) print(len(transaction_2)) print(len(transaction)) 5000 1786 6786
ノック3 データを結合(ジョイン)してみよう 横方向結合編
ジョインする場合、しっかりと主軸になるデータを考えつつ、どの列をキーにジョインするかを考えていきます。
ここでは、transaction_detail1の方が詳細な情報が含まれているため主軸データとします。
そしてジョインするキーはtransaction内の次のカラムとします。
- transaction_id
- payment_date
- customer_id
join_data = pd.merge(transaction_detail1, transaction[["transaction_id","payment_date","customer_id"]],on="transaction_id",how="left")
結果は次のとおりです。
detail_id transaction_id item_id quantity payment_date customer_id 0 0 T0000000113 S005 1 2019-02-01 01:36:57 PL563502 1 1 T0000000114 S001 1 2019-02-01 01:37:23 HD678019 2 2 T0000000115 S003 1 2019-02-01 02:34:19 HD298120 3 3 T0000000116 S005 1 2019-02-01 02:47:23 IK452215 4 4 T0000000117 S002 2 2019-02-01 04:33:46 PL542865
ノック5 必要なデータを作ろう 編
ここでは売り上げの列[price]を作るために、quantity(量)とitem_priceの掛け算で計算します。
join_data["price"] = join_data["quantity"] * join_data["item_price"]
実行結果
右端に[price]カラムが追加され、掛け算した結果が追加されています。
detail_id transaction_id item_id quantity payment_date customer_id customer_name registration_date customer_name_kana email gender age birth pref item_name item_price price 0 0 T0000000113 S005 1 2019-02-01 01:36:57 PL563502 井本 芳正 2019-01-07 14:34:35 いもと よしまさ imoto_yoshimasa@example.com M 30 1989/7/15 熊本県 PC-E 210000 210000 1 1 T0000000114 S001 1 2019-02-01 01:37:23 HD678019 三船 六郎 2019-01-27 18:00:11 みふね ろくろう mifune_rokurou@example.com M 73 1945/11/29 京都府 PC-A 50000 50000 2 2 T0000000115 S003 1 2019-02-01 02:34:19 HD298120 山根 小雁 2019-01-11 08:16:02 やまね こがん yamane_kogan@example.com M 42 1977/5/17 茨城県 PC-C 120000 120000 3 3 T0000000116 S005 1 2019-02-01 02:47:23 IK452215 池田 菜摘 2019-01-10 05:07:38 いけだ なつみ ikeda_natsumi@example.com F 47 1972/3/17 兵庫県 PC-E 210000 210000 4 4 T0000000117 S002 2 2019-02-01 04:33:46 PL542865 栗田 憲一 2019-01-25 06:46:05 くりた けんいち kurita_kenichi@example.com M 74 1944/12/17 長崎県 PC-B 85000 170000
ノック8 object型をdatetime型に変換する 編
join_data.dtypesを実行するとpayment_dateの型がobjectです。
これをdatetime型に変換してみます。
detail_id int64 transaction_id object item_id object quantity int64 payment_date object customer_id object customer_name object registration_date object customer_name_kana object email object gender object age int64 birth object pref object item_name object item_price int64 price int64 dtype: object
1行目ではpd.to_datetimeを利用しdatetime型へ変換します。
2行目で新しくpayment_monthを用意し、そこに年月のみを入れ込む
join_data["payment_date"] = pd.to_datetime(join_data["payment_date"]) join_data["payment_month"] = join_data["payment_date"].dt.strftime("%Y%m")
実行結果
最終行の実行結果はjoin_data["payment_date"].dtypesの結果である。
payment_date payment_month 0 2019-02-01 01:36:57 201902 1 2019-02-01 01:37:23 201902 2 2019-02-01 02:34:19 201902 3 2019-02-01 02:47:23 201902 4 2019-02-01 04:33:46 201902 datetime64[ns]
~続く~ 2021年3月26日追記