Tengo algunos problemas con esto. Mi dataframe se ve así:

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  

Entonces, lo que necesito hacer es que, después de que el ficticio obtenga el valor = 1, necesito llenar la variable de cantidad con ceros para cada id, así:

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 

Supongo que necesitaré una combinación de groupby('id'), fillna(method='ffill'), tal vez un .loc o un shift(), pero todo lo que probé ha tenido algún problema o es muy lento . ¿Alguna sugerencia?

5
Juan C 4 oct. 2019 a las 16:38

4 respuestas

La mejor respuesta

La forma en que usaré

s = df.groupby('id')['dummy'].ffill().eq(1)
df.loc[s&df.dummy.isna(),'amount']=0
6
YOBEN_S 4 oct. 2019 a las 14:02

Por favor, intente seguir.

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

La salida será la siguiente.

    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
RavinderSingh13 6 oct. 2019 a las 08:52

Puedes hacer esto mucho más fácil:

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

Esto seleccionará todas las filas donde dummy es nan y llenará la columna de cantidad con 0.

2
Zephyrus 4 oct. 2019 a las 13:50

IIUC, ffill() y enmascarar el still-nan:

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

Salida:

   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
Quang Hoang 4 oct. 2019 a las 13:48
58237556