Условно между дублированными значениями через разные столбцы - PullRequest
0 голосов
/ 19 марта 2019

Клиент дублируется, если у него более одной подписки. Я хочу создать new_status для статуса клиента в целом, а не для каждой из подписок: клиенту, который повторно активировал подписку и клиенту, который отменил одну подписку, но все еще имеет другую активную.

ДФ:

Customer | Status  | Canceled_at | Created  | New_status
 X       | Active  |             |8/9/2017  |
 X       |Canceled |  8/3/2017   |6/19/2017 |             
 Y       | Active  |             |2/13/2019 |
 Y       |Canceled | 11/28/2018  |10/14/2018|
 Z       | Active  |             |3/29/2018 |
 Z       |Canceled | 8/8/2018    |7/10/2018 |
 A       |Canceled | 9/2/2018    |7/10/2018 |          
 A       |Canceled | 9/29/2018   |7/12/2018 |
 A       |Active   |             |5/31/2018 |

Условием для такой ситуации является: если дата отмененного дубликата отмененного дубликата> дата создания активного: новый _статус будет понижен если дата отмененного дублирования отмененного дубликата <дата создания active: new_status будет 'Reactivate' </p>

Желаемый вывод:

Customer | Status  | Canceled_at | Created  | New_status
 X       | Active  |             |8/9/2017  |Reactivate
 X       |Canceled |  8/3/2017   |6/19/2017 |Reactivate              
 Y       | Active  |             |2/13/2019 |Reactivate
 Y       |Canceled | 11/28/2018  |10/14/2018|Reactivate
 Z       | Active  |             |3/29/2018 |Downgrade
 Z       |Canceled | 8/8/2018    |7/10/2018 |Downgrade
 A       |Canceled | 9/2/2018    |7/10/2018 |Downgrade           
 A       |Canceled | 9/29/2018   |7/12/2018 |Downgrade
 A       |Active   |             |5/31/2018 |Downgrade

1 Ответ

1 голос
/ 19 марта 2019

Я слишком новичок, чтобы комментировать, но мне нужно больше информации, почему «Y» покупатель повторно активирует?Может быть, я не понимаю вашего объяснения, потому что клиент «А» находится в аналогичной ситуации, а вы дали ему «Понижение».Может быть, просто введите свой вопрос еще раз, но представьте, что его читает 8-летний человек (мне).

Вот код, который вам нужен, но он работает:

#convert columns to dates
df['Canceled_at'] = pd.to_datetime(df['Canceled_at'])
df['Created'] = pd.to_datetime(df['Created'])

#make customer a list so we can loop through it
customer = list(df['Customer'].drop_duplicates())

#super awesome for loop that give us the largest date (this is the part where maybe your logic is different than what I read it as)
for c in customer:
    df.loc[(df['Customer'] == c), 'Most Recent Cancel'] = df.loc[(df['Customer'] == c)]['Canceled_at'].max()
    df.loc[(df['Customer'] == c), 'Most Recent Created'] = df.loc[(df['Customer'] == c)]['Created'].max()

#Make 'New_status' column
df.loc[(df['Most Recent Created'] > df['Most Recent Cancel']), 'New_status'] = 'Reactivate'
df.loc[(df['New_status'] != 'Reactivate'), 'New_status'] = 'Downgrade'
...