#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:
Попробуй:
groupby
и создайте список месяцев для каждого идентификатора пользователя- Сохраняйте только строки, в которых месяцы включают как январь, так и февраль, т. е. набор
{"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. признано 🙂