Comment remplacer NaNs par les valeurs précédentes dans les pandas DataFrame?
Supposons que j'ai un DataFrame avec certains NaN
s:
>>> import pandas as pd
>>> df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
>>> df
0 1 2
0 1 2 3
1 4 NaN NaN
2 NaN NaN 9
Ce que je dois faire est de remplacer tous les NaN
avec le premier non-NaN
valeur dans la même colonne au-dessus d'elle. Il est supposé que la première ligne ne sera jamais contenir un NaN
. Donc, pour l'exemple précédent, le résultat serait
0 1 2
0 1 2 3
1 4 2 3
2 4 2 9
Je peux juste faire une boucle par l'ensemble du DataFrame colonne par colonne, élément par élément et réglez les valeurs directement, mais est-il facile (de façon optimale dans une boucle libre) façon d'atteindre cet objectif?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
fillna
méthode sur le DataFrame et spécifier la méthode queffill
(avant de remplir):Cette méthode...
De faire le chemin inverse, il y a aussi un
bfill
méthode.Cette méthode ne modifie pas le DataFrame inplace - vous aurez besoin de relier le retour de l'DataFrame à une variable ou de préciser
inplace=True
:Accepté la réponse est parfait. J'ai eu un connexes, mais légèrement différent de la situation où j'ai eu à remplir de l'avant, mais seulement à l'intérieur des groupes. Dans le cas où quelqu'un a le même besoin, sachez que fillna travaille sur un DataFrameGroupBy objet.
Vous pouvez utiliser
pandas.DataFrame.fillna
avec lemethod='ffill'
option.'ffill'
signifie "avant de remplir" et de propagation de la dernière observation valide de l'avant. L'alternative est'bfill'
qui fonctionne de la même manière, mais à l'envers.Il y a aussi un direct synonyme de la fonction pour cela,
pandas.DataFrame.ffill
, pour rendre les choses plus simples.Une chose que j'ai remarqué lors de la tentative de cette solution est que si vous avez N/A au début ou à la fin du tableau, ffill et bfill n'avez pas assez de travail. Vous avez besoin des deux.
Juste d'accord avec
ffill
méthode, mais une info, c'est que vous pouvez limiter la avant de remplir avec de l'argument mot-clélimit
.Maintenant avec
limit
argument mot-cléffill
a maintenant sa propre méthodemp.DataFrame.ffill
Une seule colonne version
Dans mon cas, nous avons le temps de la série à partir de différents appareils, mais certains appareils ne pouvaient pas envoyer de toute valeur au cours d'une certaine période. Donc, nous devrions créer NA de valeurs pour chaque appareil et une période de temps et après que faire fillna.
Résultat: