Existe-t-il un moyen simple de réduire le temps à zéro avec chaque nouvelle condition dans une base de données pandas ?

J'ai une trame de données de séries chronologiques à gros cul où une condition change à intervalles variables. Je voudrais mettre à zéro le temps avec chaque nouvelle condition, j'ai donc converti les catégories en nombres entiers et créé une nouvelle colonne en utilisant le.diff() pour indiquer les lignes où le commutateur se produit avec des valeurs non nulles. Ensuite, j'ai créé une nouvelle colonne, "Mod_time" comme conteneur pour les nouvelles valeurs de temps qui se mettent à zéro à chaque nouvelle condition. Voici à quoi je veux que le tableau ressemble:























































TempsÉtatCondition numériqueFruit_switchMod_time
0Pommes6dans0
unePommes60une
2Pommes602
3Pommes603
4Des oranges2-40
5Des oranges20une

Solution du problème

Il existe toute une variété de problèmes qui impliquent une somme cumulée avec réinitialisation. Celui-ci peut être vu comme tel : vous aimeriez faire la somme cumulée des différences de temps, avec une réinitialisation lorsque la "condition numérique" change.

import numpy as np
def cumsum_reset(v, reset):
v = v.copy()
c = np.cumsum(~reset)
v[reset] = -np.diff(np.r_[0, c[reset]])
return np.cumsum(v)
# application
cond = df['Numerical Condition']
df['Mod_time'] = cumsum_reset(np.diff(np.r_[0, df['Time']]),cond!= cond.shift())

Sur vos données :

 Time Condition Numerical Condition Fruit_switch Mod_time
0 0 Apples 6 NaN 0
1 1 Apples 6 0.0 1
2 2 Apples 6 0.0 2
3 3 Apples 6 0.0 3
4 4 Oranges 2 -4.0 0
5 5 Oranges 2 0.0 1

Modifier

D'après les commentaires, il semble que la réinitialisation devrait vraiment provenir du moment où df['Condition'](le nom du fruit) change. De plus, la différence de temps entre les lignes est toujours égale à un. Par conséquent, les éléments suivants devraient également fonctionner :

c = df['Condition']
df['Mod_time'] = cumsum_reset(np.ones_like(c), c.shift()!= c)

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"