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