Заполнение панд другим столбцом (я не знаю, как это назвать) - PullRequest
0 голосов
/ 11 октября 2018

У меня есть фрейм данных pandas со столбцом, который указывает, были ли условия счета изменены в течение определенного периода со значением «Y».Вот пример:

import pandas as pd
account = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3]
period = [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 1, 2, 3]
changed = ["N", "N", "N", "Y", "N", "N", "N", "Y", "N", "N", "N", "N", "N", "N"]

df = pd.DataFrame({'account': account,'period': period,'changed': changed})

print(df)
    account period changed
0    1       1       N
1    1       2       N
2    1       3       N
3    1       4       Y
4    1       5       N
5    1       6       N
6    2       1       N
7    2       2       Y
8    2       3       N
9    2       4       N
10   2       5       N
11   3       1       N
12   3       2       N
13   3       3       N

Я хочу превратить измененный столбец в выключатель, который после включения остается для этой учетной записи.Я также хочу, чтобы переключатель был преобразован в 0 и 1, как показано ниже.

Есть ли способ сделать это, не проходя по каждой учетной записи.У меня миллионы аккаунтов.

    account period  changed
0    1       1        0
1    1       2        0
2    1       3        0
3    1       4        1
4    1       5        1
5    1       6        1
6    2       1        0
7    2       2        1
8    2       3        1
9    2       4        1
10   2       5        1
11   3       1        0
12   3       2        0
13   3       3        0

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы можете использовать логическое сравнение и преобразовать в int.Затем используйте GroupBy + cummax, чтобы определить, что исторически произошли изменения: account:

df['changed'] = df['changed'].eq('Y').astype(int)
df['changed'] = df.groupby('account')['changed'].cummax()

print(df)

    account  period  changed
0         1       1        0
1         1       2        0
2         1       3        0
3         1       4        1
4         1       5        1
5         1       6        1
6         2       1        0
7         2       2        1
8         2       3        1
9         2       4        1
10        2       5        1
11        3       1        0
12        3       2        0
13        3       3        0
0 голосов
/ 11 октября 2018

Это больше похоже на groupby с cumsum проблемой

(df.changed.eq('Y')).groupby(df['ID']).cumsum().astype(int)
Out[141]: 
0     0
1     0
2     0
3     1
4     1
5     1
6     0
7     1
8     1
9     1
10    1
11    0
12    0
13    0
Name: changed, dtype: int32
...