Найдите две последние даты для каждого клиента в Python, используя панд - PullRequest
0 голосов
/ 30 октября 2018

У меня есть датафрейм pandas с датой покупки каждого клиента. Я хочу узнать самую последнюю дату покупки и вторую самую последнюю дату покупки каждого уникального клиента. Вот мой фрейм данных:

   name    date
    ab1     6/1/18
    ab1     6/2/18
    ab1     6/3/18
    ab1     6/4/18
    ab2     6/8/18
    ab2     6/9/18
    ab3     6/23/18

Я ожидаю следующий вывод:

name    second most recent date        most recent date
ab1      6/3/18                         6/4/18
ab2      6/8/18                         6/9/18
ab3      6/23/18                        6/23/18

Я знаю, data['date'].max() может дать самую последнюю дату покупки, но я понятия не имею, как мне найти вторую самую последнюю дату. Любая помощь будет высоко оценена.

1 Ответ

0 голосов
/ 30 октября 2018

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

Вот пример:

import pandas as pd

# set up data from your example
df = pd.DataFrame({
    "name": ["ab1", "ab1", "ab1", "ab1", "ab2", "ab2", "ab3"],
    "date": ["6/1/18", "6/2/18", "6/3/18", "6/4/18", "6/8/18", "6/9/18", "6/23/18"]
})

# create column of datetimes (for sorting reverse-chronologically)
df["datetime"] = pd.to_datetime(df.date)

# group by name and convert dates into individual columns
grouped_df = df.sort_values(
    "datetime", ascending=False
).groupby("name")["date"].apply(list).apply(pd.Series).reset_index()
# truncate and rename columns
grouped_df = grouped_df[["name", 0, 1]]
grouped_df.columns = ["name", "most_recent", "second_most_recent"]

С grouped_df вот так в конце:

  name most_recent second_most_recent
0  ab1      6/4/18             6/3/18
1  ab2      6/9/18             6/8/18
2  ab3     6/23/18                NaN

Если вы хотите заполнить все пропущенные значения second_most_recent соответствующим значением most_recent, вы можете использовать np.where. Как это:

import numpy as np

grouped_df["second_most_recent"] = np.where(
    grouped_df.second_most_recent.isna(),
    grouped_df.most_recent,
    grouped_df.second_most_recent
)

С результатом:

  name most_recent second_most_recent
0  ab1      6/4/18             6/3/18
1  ab2      6/9/18             6/8/18
2  ab3     6/23/18            6/23/18
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...