Панды - считать с момента последней транзакции - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть фрейм данных (назовите его txn_df), который содержит записи о денежных транзакциях, вот основные столбцы этой проблемы:

txn_year    txn_month   custid  withdraw    deposit
2011        4           123     0.0         100.0
2011        5           123     0.0         0.0
2011        6           123     0.0         0.0
2011        7           123     50.1        0.0
2011        8           123     0.0         0.0

Предположим также, что у нас здесь несколько клиентов.Значение withdraw и deposit 0.0 для обоих означает, что транзакция не состоялась.Я хочу создать новый столбец, в котором указано, сколько месяцев прошло с момента совершения транзакции.Что-то похожее на это:

txn_year    txn_month   custid  withdraw    deposit     num_months_since_last_txn
2011        4           123     0.0         100.0       0
2011        5           123     0.0         0.0         1
2011        6           123     0.0         0.0         2           
2011        7           123     50.1        0.0         3
2011        8           123     0.0         0.0         1

Единственное решение, о котором я могу только подумать, - это создать новый столбец has_txn (который равен 1/0 или True / False), когда любой из withdraw и deposit имеет значение> 0,0, но я не могу продолжать оттуда.

1 Ответ

0 голосов
/ 25 сентября 2018

один из способов решения этой проблемы,

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

Объяснение:

  1. Чтобы получить транзакцию или нет, используйте ne и сумму для получения значений в двоичном формате.
  2. , когда транзакция равна 1, создайте ряд из 0,1,2 ... n, используя groupby, cumsum, cumcount.
  3. измените значение для 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,1].Таким образом, чтобы сделать тот же формат, сортируйте df по cust_id и txn_month, на будущее вы можете добавить txn_year.
  2. fillna (0), здесь работать не будет, потому что сдвиг не создаст NaN для следующего клиента.Для сброса в 0 Найдите дубликат идентификатора клиента и возьмите первое значение, замените его на 0.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...