¿Cómo fillna () con valor 0 después de llamar a remuestrear?

O no entiendo la documentación o está desactualizada.

Si corro

user[["DOC_ACC_DT", "USER_SIGNON_ID"]].groupby("DOC_ACC_DT").agg(["count"]).resample("1D").fillna(value=0, method="ffill") 

Se consigue

 TypeError: fillna() got an unexpected keyword argument 'value' 

Si solo corro

 .fillna(0) 

yo obtengo

 ValueError: Invalid fill method. Expecting pad (ffill), backfill (bfill) or nearest. Got 0 

Si luego pongo

 .fillna(0, method="ffill") 

yo obtengo

 TypeError: fillna() got multiple values for keyword argument 'method' 

así que lo único que funciona es

 .fillna("ffill") 

pero por supuesto eso hace solo un relleno hacia adelante. Sin embargo, quiero reemplazar NaN con ceros. ¿Qué estoy haciendo mal aquí?

Bueno, no entiendo por qué el código anterior no funciona y voy a esperar que alguien responda mejor que esto, pero acabo de encontrar

 .replace(np.nan, 0) 

hace lo que hubiera esperado de .fillna(0) .

Hago alguna prueba y es muy interesante.

Muestra:

 import pandas as pd import numpy as np np.random.seed(1) rng = pd.date_range('1/1/2012', periods=20, freq='S') df = pd.DataFrame({'a':['a'] * 10 + ['b'] * 10, 'b':np.random.randint(0, 500, len(rng))}, index=rng) df.b.iloc[3:8] = np.nan print (df) ab 2012-01-01 00:00:00 a 37.0 2012-01-01 00:00:01 a 235.0 2012-01-01 00:00:02 a 396.0 2012-01-01 00:00:03 a NaN 2012-01-01 00:00:04 a NaN 2012-01-01 00:00:05 a NaN 2012-01-01 00:00:06 a NaN 2012-01-01 00:00:07 a NaN 2012-01-01 00:00:08 a 335.0 2012-01-01 00:00:09 a 448.0 2012-01-01 00:00:10 b 144.0 2012-01-01 00:00:11 b 129.0 2012-01-01 00:00:12 b 460.0 2012-01-01 00:00:13 b 71.0 2012-01-01 00:00:14 b 237.0 2012-01-01 00:00:15 b 390.0 2012-01-01 00:00:16 b 281.0 2012-01-01 00:00:17 b 178.0 2012-01-01 00:00:18 b 276.0 2012-01-01 00:00:19 b 254.0 

Downsampling :

Posible solución con Resampler.asfreq :

Si usa asfreq , el comportamiento es el mismo agregado al first :

 print (df.groupby('a').resample('2S').first()) ab aa 2012-01-01 00:00:00 a 37.0 2012-01-01 00:00:02 a 396.0 2012-01-01 00:00:04 a NaN 2012-01-01 00:00:06 a NaN 2012-01-01 00:00:08 a 335.0 b 2012-01-01 00:00:10 b 144.0 2012-01-01 00:00:12 b 460.0 2012-01-01 00:00:14 b 237.0 2012-01-01 00:00:16 b 281.0 2012-01-01 00:00:18 b 276.0 
 print (df.groupby('a').resample('2S').first().fillna(0)) ab aa 2012-01-01 00:00:00 a 37.0 2012-01-01 00:00:02 a 396.0 2012-01-01 00:00:04 a 0.0 2012-01-01 00:00:06 a 0.0 2012-01-01 00:00:08 a 335.0 b 2012-01-01 00:00:10 b 144.0 2012-01-01 00:00:12 b 460.0 2012-01-01 00:00:14 b 237.0 2012-01-01 00:00:16 b 281.0 2012-01-01 00:00:18 b 276.0 print (df.groupby('a').resample('2S').asfreq().fillna(0)) ab aa 2012-01-01 00:00:00 a 37.0 2012-01-01 00:00:02 a 396.0 2012-01-01 00:00:04 a 0.0 2012-01-01 00:00:06 a 0.0 2012-01-01 00:00:08 a 335.0 b 2012-01-01 00:00:10 b 144.0 2012-01-01 00:00:12 b 460.0 2012-01-01 00:00:14 b 237.0 2012-01-01 00:00:16 b 281.0 2012-01-01 00:00:18 b 276.0 

Si se replace uso, se agregan otros valores como mean

 print (df.groupby('a').resample('2S').mean()) b aa 2012-01-01 00:00:00 136.0 2012-01-01 00:00:02 396.0 2012-01-01 00:00:04 NaN 2012-01-01 00:00:06 NaN 2012-01-01 00:00:08 391.5 b 2012-01-01 00:00:10 136.5 2012-01-01 00:00:12 265.5 2012-01-01 00:00:14 313.5 2012-01-01 00:00:16 229.5 2012-01-01 00:00:18 265.0 
 print (df.groupby('a').resample('2S').mean().fillna(0)) b aa 2012-01-01 00:00:00 136.0 2012-01-01 00:00:02 396.0 2012-01-01 00:00:04 0.0 2012-01-01 00:00:06 0.0 2012-01-01 00:00:08 391.5 b 2012-01-01 00:00:10 136.5 2012-01-01 00:00:12 265.5 2012-01-01 00:00:14 313.5 2012-01-01 00:00:16 229.5 2012-01-01 00:00:18 265.0 print (df.groupby('a').resample('2S').replace(np.nan,0)) b aa 2012-01-01 00:00:00 136.0 2012-01-01 00:00:02 396.0 2012-01-01 00:00:04 0.0 2012-01-01 00:00:06 0.0 2012-01-01 00:00:08 391.5 b 2012-01-01 00:00:10 136.5 2012-01-01 00:00:12 265.5 2012-01-01 00:00:14 313.5 2012-01-01 00:00:16 229.5 2012-01-01 00:00:18 265.0 

Upsampling :

Use asfreq , es lo mismo que replace :

 print (df.groupby('a').resample('200L').asfreq().fillna(0)) ab aa 2012-01-01 00:00:00.000 a 37.0 2012-01-01 00:00:00.200 0 0.0 2012-01-01 00:00:00.400 0 0.0 2012-01-01 00:00:00.600 0 0.0 2012-01-01 00:00:00.800 0 0.0 2012-01-01 00:00:01.000 a 235.0 2012-01-01 00:00:01.200 0 0.0 2012-01-01 00:00:01.400 0 0.0 2012-01-01 00:00:01.600 0 0.0 2012-01-01 00:00:01.800 0 0.0 2012-01-01 00:00:02.000 a 396.0 2012-01-01 00:00:02.200 0 0.0 2012-01-01 00:00:02.400 0 0.0 ... print (df.groupby('a').resample('200L').replace(np.nan,0)) b aa 2012-01-01 00:00:00.000 37.0 2012-01-01 00:00:00.200 0.0 2012-01-01 00:00:00.400 0.0 2012-01-01 00:00:00.600 0.0 2012-01-01 00:00:00.800 0.0 2012-01-01 00:00:01.000 235.0 2012-01-01 00:00:01.200 0.0 2012-01-01 00:00:01.400 0.0 2012-01-01 00:00:01.600 0.0 2012-01-01 00:00:01.800 0.0 2012-01-01 00:00:02.000 396.0 2012-01-01 00:00:02.200 0.0 2012-01-01 00:00:02.400 0.0 ... 
 print ((df.groupby('a').resample('200L').replace(np.nan,0).b == df.groupby('a').resample('200L').asfreq().fillna(0).b).all()) True 

Conclusión :

Para el submuestreo, utilice la misma función de agregación como sum , first o mean y para asfreq .

La única solución alternativa para utilizar fillna directamente sería llamarla después de ejecutar .head(len(df.index)) .

Supongo que DF.head es útil en este caso principalmente porque cuando la función de remuestreo se aplica a un objeto groupby, actuará como un filtro en la entrada, devolviendo una forma reducida del original debido a la eliminación de grupos.

La llamada a DF.head() no se ve afectada por esta transformación y devuelve todo el DF .

Manifestación:

 np.random.seed(42) df = pd.DataFrame(np.random.randn(10, 2), index=pd.date_range('1/1/2016', freq='10D', periods=10), columns=['A', 'B']).reset_index() df index AB 0 2016-01-01 0.496714 -0.138264 1 2016-01-11 0.647689 1.523030 2 2016-01-21 -0.234153 -0.234137 3 2016-01-31 1.579213 0.767435 4 2016-02-10 -0.469474 0.542560 5 2016-02-20 -0.463418 -0.465730 6 2016-03-01 0.241962 -1.913280 7 2016-03-11 -1.724918 -0.562288 8 2016-03-21 -1.012831 0.314247 9 2016-03-31 -0.908024 -1.412304 

Operaciones:

 resampled_group = df[['index', 'A']].groupby(['index'])['A'].agg('count').resample('2D') resampled_group.head(len(resampled_group.index)).fillna(0).head(20) index 2016-01-01 1.0 2016-01-03 0.0 2016-01-05 0.0 2016-01-07 0.0 2016-01-09 0.0 2016-01-11 1.0 2016-01-13 0.0 2016-01-15 0.0 2016-01-17 0.0 2016-01-19 0.0 2016-01-21 1.0 2016-01-23 0.0 2016-01-25 0.0 2016-01-27 0.0 2016-01-29 0.0 2016-01-31 1.0 2016-02-02 0.0 2016-02-04 0.0 2016-02-06 0.0 2016-02-08 0.0 Freq: 2D, Name: A, dtype: float64 

El problema aquí es que intenta llamar al método fillna desde el objeto DatetimeIndexResampler , que es devuelto por el método resample . Si llama a una función de agregación antes de fillna, funcionará, por ejemplo: df.resample('1H').sum().fillna(0)