グループの抽出 演習

次のような、あるジムの利用ログのデータがあります。データは列利用日でソートされています。


ログID
利用者ID利用日利用時間(分)
1001U00012022/02/0145
1002U00022022/02/0162
1031U00022022/02/2670
1032U00022022/02/27124
  • 利用者ID利用日が同じ組み合わせの行はありません。たとえば、「利用者IDがU0001かつ利用日が2022/02/01」のデータは1行だけです。
  • 欠損値はありません。

次の条件に当てはまるグループのデータを抽出してください。

(1)利用者が3人(3種類)以上いた日のデータ

利用者が3人以上いた日のデータだけを抽出して、変数result_df_1に格納してください。なお、ここでの「利用者が3人以上いる」とは、「列利用者IDの種類数が3以上であること」を意味します。

(2) 120分以上利用したログが2件以上ある利用者のデータ

120分以上利用したログが2件以上ある利用者のデータだけを抽出して、変数result_df_2に格納してください。

解答

import pandas as pd

# ジムの利用履歴データを読み込み
df = pd.read_csv("dataset/gym_log.csv", index_col="ログID")
# 先頭5行を確認
df.head()
利用者ID利用日利用時間(分)
ログID
1001U00012022/02/0145
1002U00022022/02/0162
1003U00012022/02/0230
1004U00032022/02/0293
1005U00022022/02/0358

(1) 利用者が3人(3種類)以上いた日のデータ

# 利用日ごとに抽出するかどうかを判定するので、
# 列「利用日」でグループ化
grouped_date = df.groupby("利用日")


def is_many_users_day(g_df):
    # 利用者のユニーク数が3以上
    return g_df["利用者ID"].nunique() >= 3


# 抽出対象かどうか判定する関数を適用
result_df_1 = grouped_date.filter(is_many_users_day)
result_df_1

Out[2]:

利用者ID利用日利用時間(分)
ログID
1012U00012022/02/11119
1013U00022022/02/1182
1014U00032022/02/1145
1018U00032022/02/16130
1019U00042022/02/1645
1020U00052022/02/1645
1023U00012022/02/2092
1024U00042022/02/2067
1025U00052022/02/2068

(2) 120分以上利用したログが2件以上ある利用者のデータ

# 利用者ごとに抽出するかどうかを判定するので、
# 列「利用者ID」でグループ化
grouped_user = df.groupby("利用者ID")


def is_long_time_user(g_df):
    # 120分以上の利用したログが2件以上あるかどうかを判定する関数
  g_df["利用時間(分)"] >= 120 で 120以上の要素はTrue,未満はFalseになる。
    sum()は合計を計算する(Trueは1、Falseは0として計算される)
  もし、ここでcount()を使用すると、数を数えるので、TrueもFalseも1になる。
    # 120分以上利用したログの件数を計算
    count = (g_df["利用時間(分)"] >= 120).sum()
    return count >= 2  # 2件以上あるかどうか


# 抽出対象かどうか判定する関数を適用
result_df_2 = grouped_user.filter(is_long_time_user)
result_df_2
利用者ID利用日利用時間(分)
ログID
1001U00012022/02/0145
1002U00022022/02/0162
1003U00012022/02/0230
1005U00022022/02/0358
1006U00022022/02/0552
1007U00012022/02/06123
1008U00012022/02/0853
1010U00012022/02/0935
1012U00012022/02/11119
1013U00022022/02/1182
1015U00012022/02/13134
1016U00022022/02/14182
1017U00012022/02/1548
1022U00022022/02/19162
1023U00012022/02/2092
1026U00012022/02/2245
1027U00022022/02/2220
1031U00022022/02/2670
1032U00022022/02/27124

コメント

タイトルとURLをコピーしました