2
votes

Python - remplissez NA par la valeur des lignes précédentes en fonction de la colonne d'identifiant

Je voudrais remplir la valeur manquante dans 2 colonnes. Il y a Date et Cat2 doivent être remplis avec la valeur d'une autre ligne en fonction de la dernière date pour Cat1 prédéfinie (prédéfinie dans les lignes remplies précédentes), par exemple:

Exemple de données:

Day  Date      Cat1      Cat2
1    31/12/17  cat       mouse
2    01/09/18  cat       mouse
3    27/05/18  dog       elephant
4    01/09/18  cat       mouse
5    01/09/18  cat       mouse


0 commentaires

3 Réponses :


2
votes

Je pense que vous avez besoin de GroupBy.ffill avec DataFrame.reindex pour la même commande que l'original DataFrame:

df = df.groupby('Cat1').ffill().reindex(df.columns, axis=1)
print (df)
   Day      Date Cat1      Cat2
0    1  31/12/17  cat     mouse
1    2  01/09/18  cat     mouse
2    3  27/05/18  dog  elephant
3    4  01/09/18  cat     mouse
4    5  01/09/18  cat     mouse


3 commentaires

Merci pour votre réponse rapide. La colonne Date est correctement remplie par la dernière date pour Cat1 , mais la colonne Cat2 a été remplie sans condition pour Cat1 (< code> éléphant à la place de souris ).


@@ Jezrael, vous avez raison. Je comprends où est mon problème. Avant d'exécuter les suggestions df.groupby ('Cat1'). Ffill (). Reindex (df.columns, axis = 1) , j'exécute sort_values ​​ comme: data.sort_values ​​(by = ['Date'], inplace = True, ascending = True) . Donc, je suppose que c'est pourquoi il y avait un problème. Merci beaucoup.


@Cindy - Merci, ravie de vous aider. N'oubliez pas d'accepter la réponse, si cela vous convient! :)



1
votes

De plus, une alternative est:

data = data.groupby(['Cat1'], as_index = False).apply(lambda group: group.ffill())

Merci, @Jezrael pour l'idée de la solution :)


0 commentaires

0
votes

Vous pouvez utiliser un dict:

dict = df[['cat','cat2']].drop_duplicates(keep='first', inplace=False).to_dict()
df['cat2'] = df['cat1'].replace(dict)

pour la colonne de séries temporelles que vous pouvez utiliser timedelta (extrapolation linéaire). bonne chance!


0 commentaires