如何根据user_id和购买月份提取数据?

How to extract data based on user_id and purchase month?

我有一个数据集,我需要从中提取用户和在 1 月和 2 月这两个月购买的用户数据。你能帮我写代码吗?

所需的输出应该如下所示

过滤器:

df[(df["Purchase month"]=="Jan") | (df["Purchase month"]=="Feb")]

排序:

df.sort_values(by=["user_id"])

首先,我们可以使用groupby获取不同购买月份的列表:

>>> df = df.sort_values(by='purchase_month', ascending=False)
>>> df_grouped = df.groupby(['user_id'])['purchase_month'].apply(lambda x: list(np.unique(x))).reset_index()
>>> df_grouped['purchase_month'] = df_grouped['purchase_month'].astype(str)
>>> df_grouped
    user_id purchase_month
0   1       ['Feb', 'Jan']
1   2       ['Feb']
2   3       ['Feb', 'Jan']
3   4       ['mar', 'mar']

然后,我们筛选至少在 2 个不同月份内购买过的客户:

>>> valid_users = df_grouped[df_grouped['purchase_month'] == "['Feb', 'Jan']"]['user_id'].tolist()
>>> valid_users
[1, 3]

最后,我们可以用这些用户过滤第一个 DataFrame 以获得预期的结果:

>>> df[df["user_id"].isin(valid_users)].sort_values(by=["user_id"])
    user_id purchase_month  product
0   1       jan             football
3   1       feb             bed
2   3       feb             toaster
4   3       jan             printer

尝试:

  1. groupby 并为每个用户 ID 创建月份列表
  2. 只保留月份包括 Jan 和 Feb 的行,即集合 {"Jan", "Feb"} 是月份
  3. 的子集
months = df.groupby("User id")["Purchase month"].agg(list)
output = df[df["User id"].isin(months[months.map({"Jan", "Feb"}.issubset)].index)]

>>> output
   User id Purchase month   Product
0        1            Jan  Football
2        3            Feb   Toaster
3        1            Feb       Bed
4        3            Jan   Printer