один из способов решения этой проблемы,
df['series'] = df[['withdraw','deposit']].ne(0).sum(axis=1)
m = df['series']>=1
Как прокомментировал @Chris A,
m = df[['withdraw','deposit']].gt(0).any(axis=1) #replacement for above snippet,
df['num_months_since_last_txn'] = df.groupby(m.cumsum()).cumcount()
df.loc[df['num_months_since_last_txn']==0,'num_months_since_last_txn']=(df['num_months_since_last_txn']+1).shift(1).fillna(0)
print df
Вывод:
txn_year txn_month custid withdraw deposit
0 2011 4 123 0.0 100.0
1 2011 5 123 0.0 0.0
2 2011 6 123 0.0 0.0
3 2011 7 123 50.1 0.0
4 2011 8 123 0.0 0.0
txn_year txn_month custid withdraw deposit num_months_since_last_txn
0 2011 4 123 0.0 100.0 0.0
1 2011 5 123 0.0 0.0 1.0
2 2011 6 123 0.0 0.0 2.0
3 2011 7 123 50.1 0.0 3.0
4 2011 8 123 0.0 0.0 1.0
Объяснение:
- Чтобы получить транзакцию или нет, используйте
ne
и сумму для получения значений в двоичном формате. - , когда транзакция равна 1, создайте ряд из 0,1,2 ... n, используя
groupby
, cumsum
, cumcount
. - измените значение для
0
, используя .loc
Примечание. Может быть, я добавил более сложное решение этой проблемы.Но это даст вам идею и подход к решению этой проблемы.
Решение для учета идентификатора клиента,
df=df.sort_values(by=['custid','txn_month'])
mask=~df.duplicated(subset=['custid'],keep='first')
m = df[['withdraw','deposit']].gt(0).any(axis=1)
df['num_months_since_last_txn'] = df.groupby(m.cumsum()).cumcount()
df.loc[df['num_months_since_last_txn']==0,'num_months_since_last_txn']=(df['num_months_since_last_txn']+1).shift(1)
df.loc[mask,'num_months_since_last_txn']=0
Пример ввода:
txn_year txn_month custid withdraw deposit
0 2011 4 123 0.0 100.0
1 2011 5 123 0.0 0.0
2 2011 4 1245 0.0 100.0
3 2011 5 1245 0.0 0.0
4 2011 6 123 0.0 0.0
5 2011 7 1245 50.1 0.0
6 2011 7 123 50.1 0.0
7 2011 8 123 0.0 0.0
8 2011 6 1245 0.0 0.0
9 2011 8 1245 0.0 0.0
Пример вывода:
txn_year txn_month custid withdraw deposit num_months_since_last_txn
0 2011 4 123 0.0 100.0 0.0
1 2011 5 123 0.0 0.0 1.0
4 2011 6 123 0.0 0.0 2.0
6 2011 7 123 50.1 0.0 3.0
7 2011 8 123 0.0 0.0 1.0
2 2011 4 1245 0.0 100.0 0.0
3 2011 5 1245 0.0 0.0 1.0
8 2011 6 1245 0.0 0.0 2.0
5 2011 7 1245 50.1 0.0 3.0
9 2011 8 1245 0.0 0.0 1.0
Объяснение для учета идентификатора клиента,
- Приведенный выше код работает на основе интервала между [1,1].Таким образом, чтобы сделать тот же формат, сортируйте df по cust_id и txn_month, на будущее вы можете добавить txn_year.
- fillna (0), здесь работать не будет, потому что сдвиг не создаст NaN для следующего клиента.Для сброса в 0 Найдите дубликат идентификатора клиента и возьмите первое значение, замените его на 0.