次のような、あるジムの利用ログのデータがあります。データは列利用日
でソートされています。
ログID | 利用者ID | 利用日 | 利用時間(分) |
---|---|---|---|
1001 | U0001 | 2022/02/01 | 45 |
1002 | U0002 | 2022/02/01 | 62 |
… | … | … | … |
1031 | U0002 | 2022/02/26 | 70 |
1032 | U0002 | 2022/02/27 | 124 |
利用者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 | |||
1001 | U0001 | 2022/02/01 | 45 |
1002 | U0002 | 2022/02/01 | 62 |
1003 | U0001 | 2022/02/02 | 30 |
1004 | U0003 | 2022/02/02 | 93 |
1005 | U0002 | 2022/02/03 | 58 |
(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 | |||
1012 | U0001 | 2022/02/11 | 119 |
1013 | U0002 | 2022/02/11 | 82 |
1014 | U0003 | 2022/02/11 | 45 |
1018 | U0003 | 2022/02/16 | 130 |
1019 | U0004 | 2022/02/16 | 45 |
1020 | U0005 | 2022/02/16 | 45 |
1023 | U0001 | 2022/02/20 | 92 |
1024 | U0004 | 2022/02/20 | 67 |
1025 | U0005 | 2022/02/20 | 68 |
(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 | |||
1001 | U0001 | 2022/02/01 | 45 |
1002 | U0002 | 2022/02/01 | 62 |
1003 | U0001 | 2022/02/02 | 30 |
1005 | U0002 | 2022/02/03 | 58 |
1006 | U0002 | 2022/02/05 | 52 |
1007 | U0001 | 2022/02/06 | 123 |
1008 | U0001 | 2022/02/08 | 53 |
1010 | U0001 | 2022/02/09 | 35 |
1012 | U0001 | 2022/02/11 | 119 |
1013 | U0002 | 2022/02/11 | 82 |
1015 | U0001 | 2022/02/13 | 134 |
1016 | U0002 | 2022/02/14 | 182 |
1017 | U0001 | 2022/02/15 | 48 |
1022 | U0002 | 2022/02/19 | 162 |
1023 | U0001 | 2022/02/20 | 92 |
1026 | U0001 | 2022/02/22 | 45 |
1027 | U0002 | 2022/02/22 | 20 |
1031 | U0002 | 2022/02/26 | 70 |
1032 | U0002 | 2022/02/27 | 124 |
コメント