Хорошо, может быть более питонский способ сделать это, используя .groupby()
и векторное решение, но вот решение, которое предоставит df результаты, которые вы ищете.Я полагаю на ваших данных, что ваш столбец активных продуктов не имеет значения.
#DF Setup
_______________________
col = ['cust_id', 'month', 'product', 'product_active']
data = [
(1234, 1, 'x', 1 ),
(1234, 2, 'x', 0 ),
(1235, 1, 'y', 0 ),
(1235, 2, 'y', 1 ),
(1236, 1, 'x', 1 ),
(1236, 2, 'y', 0 )]
df = pd.DataFrame(data, columns=col)
Добавлен дополнительный клиент (1236) для имитации изменения продукта (x-> y) с m1 на m2.
#Solution
______________________
result_df = pd.DataFrame()
for i,row in df.iterrows():
if i == 0:
pass
elif df.loc[i-1,'cust_id'] == df.loc[i,'cust_id']:
if (df.loc[i-1,'month'] == 1) & (df.loc[i,'month'] == 2):
if (df.loc[i-1,'product'] == 'x') & (df.loc[i,'product'] == 'y'):
result_df = result_df.append(df.loc[i])
Вот общее решение, заключенное в функцию:
def filter_function(month,p1,p2):
'''
month - month you wish to check for product change.
p1 - "From" product
p2 - "To" product
'''
result_df = pd.DataFrame()
for i,row in df.iterrows():
if i == 0:
pass
elif df.loc[i-1,'cust_id'] == df.loc[i,'cust_id']:
if (df.loc[i-1,'month'] == month-1) & (df.loc[i,'month'] == month):
if (df.loc[i-1,'product'] == p1) & (df.loc[i,'product'] == p2):
result_df = result_df.append(df.loc[i])
return result_df
filter_function(2,'x','y')