Как извлечь данные на основе идентификатора пользователя и месяца покупки?

#python #pandas #dataframe #data-science

#питон #панды #фрейм данных #наука о данных

Вопрос:

У меня есть набор данных, из которого мне нужно извлечь данные пользователя и пользователей, которые приобрели за два месяца, январь и февраль. Не могли бы вы, пожалуйста, помочь мне с кодом?

введите описание изображения здесь

Желаемый результат должен быть таким, как показано ниже

введите описание изображения здесь

Комментарии:

1. Можете ли вы поделиться тем, что вы уже пробовали?

Ответ №1:

Во-первых, мы можем использовать a groupby для получения списка различных месяцев покупок :

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

Затем мы фильтруем клиентов, покупающих по крайней мере за 2 разных месяца :

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

Чтобы закончить, мы можем отфильтровать первый кадр данных с этими пользователями, чтобы получить ожидаемый результат :

 gt;gt;gt; 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. спасибо за ваш отзыв, я не упоминал об этом раньше, но есть и другие месяцы, и эта команда проверяет наличие 2 уникальных значений независимо от заказа (в моем случае это только месяцы января и февраля). это означает, что в него будет включена любая комбинация двух уникальных значений.

2. Я обновил ответ, правильно ли он отвечает на ваш вопрос ?

3. В вашем случае он будет проверять только шаблон [«январь», «февраль»], но у клиента может быть, например, этот [«январь», «январь», «февраль»], [«февраль», «февраль», «январь»] месяцы совпадают с январем и февралем, но он не будет включен в вывод. у клиента может быть 10 покупок в январе и 3 в феврале, они должны быть включены в него.

4. В самом деле ! Я обновил ответ, чтобы избежать этого случая, работает ли это на вашей стороне ?

Ответ №2:

Фильтр:

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

Сортировать:

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

Комментарии:

1. Я думаю, что в этом случае, если какое-либо из утверждений верно, оно выберет эти данные. Мне нужны только те пользователи, которые совершили покупку как в январе, так и в феврале.

2. Ой, извините-да, вы правы-я неправильно понял вопрос! Но я вижу, у вас есть пара правильных ответов, так что я чувствую себя менее виноватым в своей небрежности 😀

Ответ №3:

Попробуй:

  1. groupby и создайте список месяцев для каждого идентификатора пользователя
  2. Сохраняйте только строки, в которых месяцы включают как январь, так и февраль, т. е. набор {"Jan", "Feb"} является подмножеством месяцев
 months = df.groupby("User id")["Purchase month"].agg(list) output = df[df["User id"].isin(months[months.map({"Jan", "Feb"}.issubset)].index)]  gt;gt;gt; output  User id Purchase month Product 0 1 Jan Football 2 3 Feb Toaster 3 1 Feb Bed 4 3 Jan Printer  

Комментарии:

1. output.month.value_counts() , он также предоставляет другую информацию, посмотрите на результат value_counts() февраль 385079 январь 300149 декабрь 178864 март 148089 ноябрь 78052 октябрь 53159 апрель 48198

2. Мне нужны только обычные пользователи месяца январь и февраль

3. Да — разве это не дает вам именно это? Идентификатор пользователя 1 и 3?

4. большое вам спасибо, что все работает так, как я хочу.

5. признано 🙂