Чтобы получить две последние даты покупки для каждого клиента, вы можете сначала отсортировать ваш фрейм данных в порядке убывания по дате, затем сгруппировать по имени и преобразовать агрегированные даты в отдельные столбцы. Наконец, возьмите первые два из этих столбцов, и у вас будут только две самые последние даты покупки для каждого клиента.
Вот пример:
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