Векторизованный способ использования предыдущего значения строки на основе условия - PullRequest
1 голос
/ 07 ноября 2019

У меня есть датафрейм панд, как показано ниже. Я хочу выполнить следующее условие: если столбец «А» равен 1, то обновите значение столбца «F» предыдущим значением «F». Это может быть сделано построчно, но это не эффективный способ сделать это. Я хочу векторизованный способ сделать это.

df = pd.DataFrame({'A':[1,1,1, 0, 0, 0, 1, 0, 0], 'C':[1,1,1, 0, 0, 0, 1, 1, 1], 'D':[1,1,1, 0, 0, 0, 1, 1, 1],
'F':[2,0,0, 0, 0, 1, 1, 1, 1]})
df

    A   C   D   F
0   1   1   1   2
1   1   1   1   0
2   1   1   1   0
3   0   0   0   0
4   0   0   0   0
5   0   0   0   1
6   1   1   1   1
7   0   1   1   1
8   0   1   1   1

Мой желаемый вывод:

    A   C   D   F
0   1   1   1   2
1   1   1   1   2
2   1   1   1   2
3   0   0   0   0
4   0   0   0   0
5   0   0   0   1
6   1   1   1   1
7   0   1   1   1
8   0   1   1   1

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

df['F'] = df.groupby(['A'])['F'].shift(1)
df

    A   C   D   F
0   1   1   1   NaN
1   1   1   1   2.0
2   1   1   1   0.0
3   0   0   0   NaN
4   0   0   0   0.0
5   0   0   0   0.0
6   1   1   1   0.0
7   0   1   1   1.0
8   0   1   1   1.0

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

transform('first')

df.F.groupby(df.A.rsub(1).cumsum()).transform('first')

0    2
1    2
2    2
3    0
4    0
5    1
6    1
7    1
8    1
Name: F, dtype: int64

Назначить столбцу 'F'

df.assign(F=df.F.groupby(df.A.rsub(1).cumsum()).transform('first'))

   A  C  D  F
0  1  1  1  2
1  1  1  1  2
2  1  1  1  2
3  0  0  0  0
4  0  0  0  0
5  0  0  0  1
6  1  1  1  1
7  0  1  1  1
8  0  1  1  1
1 голос
/ 07 ноября 2019

мы также знаем, как это сделать без группового:

where=df['A'].eq(1)&df['A'].ne(df['A'].shift())
df['F']=df['F'].where(where).ffill().mask(df['A'].ne(1),df['F'])
print(df)

   A  C  D    F
0  1  1  1  2.0
1  1  1  1  2.0
2  1  1  1  2.0
3  0  0  0  0.0
4  0  0  0  0.0
5  0  0  0  1.0
6  1  1  1  1.0
7  0  1  1  1.0
8  0  1  1  1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...