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日追記