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

У меня есть небольшая проблема с этим. Мой фрейм данных выглядит следующим образом:

id    amount    dummy
1      130        0
1      120        0
1      110        1
1      nan       nan 
1      nan       nan   
2      nan        0
2      50         0
2      20         1
2      nan       nan 
2      nan       nan  

Итак, мне нужно сделать, чтобы после того, как фиктивный элемент получил значение = 1, мне нужно заполнить переменную количества нулями для каждого id, например так:

id    amount    dummy
1      130        0
1      120        0
1      110        1
1       0        nan 
1       0        nan   
2      nan        0
2      50         0
2      20         1
2       0        nan 
2       0        nan 

Полагаю, мне понадобится какая-то комбинация groupby('id'), fillna(method='ffill'), может быть .loc или shift(), но все, что я пробовал, имело некоторые проблемы или оченьмедленный. Есть предложения?

Ответы [ 4 ]

6 голосов
/ 04 октября 2019

Как я буду использовать

s = df.groupby('id')['dummy'].ffill().eq(1)
df.loc[s&df.dummy.isna(),'amount']=0
2 голосов
/ 04 октября 2019

Вы можете сделать это намного проще:

data[data['dummy'].isna()]['amount'] = 0

Это выберет все строки, где dummy - это nan, и заполнит столбец количества 0.

1 голос
/ 06 октября 2019

Не могли бы вы попробовать следующее.

df.loc[df['dummy'].isnull(),'amount']=0
df

Вывод будет следующим.

    id  amount  dummy
0   1   130.0   0.0
1   1   120.0   0.0
2   1   110.0   1.0
3   1   0.0     NaN
4   1   0.0     NaN
5   2   NaN     0.0
6   2   50.0    0.0
7   2   20.0    1.0
8   2   0.0     NaN
9   2   0.0     NaN
1 голос
/ 04 октября 2019

IIUC, ffill() и маска неподвижного нана:

s = df.groupby('id')['amount'].ffill().notnull()
df.loc[df['amount'].isna() & s, 'amount'] = 0

Вывод:

   id  amount  dummy
0   1   130.0    0.0
1   1   120.0    0.0
2   1   110.0    1.0
3   1     0.0    NaN
4   1     0.0    NaN
5   2     NaN    0.0
6   2    50.0    0.0
7   2    20.0    1.0
8   2     0.0    NaN
9   2     0.0    NaN
...